NBUT 1121 Sakuya's Fly Knife 飞刀(暴力)

题意:给出一个带有n*m个格子的矩阵,部分格子中有靶子target,现在要从一个没有靶子的格子中射出飞刀数把,飞刀是可穿透靶子的,同一直线上都可以一刀全射掉。现在问在哪个格子射出飞刀,可以在全部射中的情况下用刀次数最少?有target的格子不可选。

思路:穷举所有没有靶子的格子,计算每个靶子的角度,若角度相同就是可以一刀解决的。这里角度可能用的是实数的,用map解决。需要注意的是,在判断角度时,可能有重复,比如: 。t。。x。t。。 这里的x代表飞刀的出发点,‘t’代表靶子,那么两边的 t 计算出来的角度是相同的(按照靶子坐标的x/y来算角度即可)。需要做的只是对上下两边进行区分即可。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 bool tar[105][105];//标出每个靶子
 4 int x[105],y[105];//记录每个靶子的坐标
 5 map<double,int> mapp1,mapp2;
 6
 7 void cal(int n,int m,int t)
 8 {
 9     int ans[3]={1000,1000,1000};//答案
10     for(int i=0; i<n; i++)
11     {
12         for(int j=0; j<m; j++)
13         {
14             if(!tar[i][j])  //对于每个非有刀格子
15             {
16                 mapp1.clear();
17                 mapp2.clear();
18                 int cnt_l=0,cnt_r=0;
19                 for(int k=0; k<t; k++)//扫描所有的target
20                 {
21                     if(y[k]>j)  //上边的
22                     {
23                         double q=(double)(y[k]-j)/(x[k]-i);
24                         if(mapp1[q]<=0)
25                             mapp1[q]=1;
26                     }
27                     else if(y[k]<j) //下边的
28                     {
29                         double q=(double)(y[k]-j)/(x[k]-i);
30                         if(mapp2[q]<=0)
31                             mapp2[q]=1;
32                     }
33                     else    //同一行的
34                     {
35                         if(x[k]>i)  //同行左边
36                             cnt_l=1;
37                         else    //同行右边
38                             cnt_r=1;
39                     }
40                 }
41                 if(ans[0]>cnt_l + cnt_r + mapp1.size()+mapp2.size())//有更少的,则更新答案
42                 {
43                     ans[0]=cnt_l + cnt_r + mapp1.size() + mapp2.size();
44                     ans[1]=i;
45                     ans[2]=j;
46                 }
47             }
48         }
49     }
50     printf("(%d, %d) %d\n",ans[1],ans[2],ans[0]);
51 }
52
53
54 int main()
55 {
56     //freopen("e://input.txt","r",stdin);
57     int n, m, t, a, b;
58     while(cin>>n>>m)
59     {
60         memset(tar,0,sizeof(tar));
61         scanf("%d",&t);
62         for(int i=0; i<t; i++)
63         {
64             scanf("%d%d",&x[i],&y[i]);
65             tar[x[i]][y[i]]=true;
66         }
67         cal(n,m,t);
68     }
69
70     return 0;
71 }

AC代码

NBUT 1121 Sakuya's Fly Knife 飞刀(暴力)

时间: 2024-08-24 06:28:45

NBUT 1121 Sakuya's Fly Knife 飞刀(暴力)的相关文章

bzoj 1800: [Ahoi2009]fly 飞行棋 暴力

1800: [Ahoi2009]fly 飞行棋 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1800 Description 给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列. 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形. Input 第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各

BZOJ 1800: [Ahoi2009]fly 飞行棋【思维题,n^4大暴力】

1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1689  Solved: 1335[Submit][Status][Discuss] Description 给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列. 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形. Input 第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度

[AHOI2009][BZOJ1800] fly 飞行棋|枚举|暴力

1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1039  Solved: 864[Submit][Status][Discuss] Description 给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列. 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形. Input 第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度 O

BZOJ 1800: [Ahoi2009]fly 飞行棋【暴力】

Description 给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列. 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形. Input 第一行为正整数N,表示点的个数,接下来N行分别为这N个点所分割的各个圆弧长度 Output 所构成不重复矩形的个数 Sample Input 812231133 Sample Output 3 HINT N<= 20 思路:唔 N<=20 逗我呢TUT #include<cstdio> #in

BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现,不能跨越),以及最后每个人被点到多少次. 分析 这种解法是用后缀数组优化一下暴力,(优化了吗?)复杂度并不能保证,然而能A... 我们先把所有名,姓,点名串都接在一个串里面. 然后匹配问题就转化成了后缀的最长公共前缀问题. 但是由于我们讨论问题的对象是名,姓,以及点名串,所以每个部分我们用不同的分隔

2015湖南省省赛 阶乘除法 暴力

阶乘除法 Time Limit:5000MS     Memory Limit:65535KB     64bit IO Format: NBUT 1643 Description 输入两个正整数 n, m,输出 n!/m!,其中阶乘定义为 n!= 1*2*3*...*n (n>=1). 比如,若 n=6, m=3,则 n!/m!=6!/3!=720/6=120. 是不是很简单?现在让我们把问题反过来:输入 k=n!/m!,找到这样的整数二元组(n,m) (n>m>=1). 如果答案不唯

[ACM] ZOJ 3816 Generalized Palindromic Number (DFS,暴力枚举)

Generalized Palindromic Number Time Limit: 2 Seconds      Memory Limit: 65536 KB A number that will be the same when it is written forwards or backwards is known as a palindromic number. For example, 1234321 is a palindromic number. We call a number 

#1121 : 二分图一?二分图判定 (HIHOCoder +二分图的判定)

#1121 : 二分图一?二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Nettle,从这个星期开始由我来完成我们的Weekly. 新年回家,又到了一年一度大龄剩男剩女的相亲时间.Nettle去姑姑家玩的时候看到了一张姑姑写的相亲情况表,上面都是姑姑介绍相亲的剩男剩女们.每行有2个名字,表示这两个人有一场相亲.由于姑姑年龄比较大了记性不是太好,加上相亲的人很多,所以姑姑一时也想不起来其中有些人的性别.因此她拜托我检查一

bzoj1800: [Ahoi2009]fly 飞行棋(乱搞)

1800: [Ahoi2009]fly 飞行棋 题目:传送门 题解: 大水题,早上签个到 没什么好说的...搞个前缀和,算个周长... 周长为奇数肯定误解啊废话QWQ 那么看到n<=20,还不暴力枚举!!! 然后看一下对角点之间的弧长是不是半周长就好啦(判定定理啊) 然后...一A 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #in