UVALive 6263 The Dragon and the knights --统计,直线分平面
题意:给n条直线,将一个平面分成很多个部分,再给m个骑士的坐标,在一个部分内只要有一个骑士即可保护该部分,问给出的m个骑士是不是保护了所有部分。
解法:计算每个骑士与每条直线的位置关系(上面还是下面),用0,1表示,所以每个骑士会有一个01串,最后统计出这n条直线分成的部分数(可能有平行的),然后排序每个骑士的01串,看有多少个处在不同部分的骑士(01串不同的个数),然后比较个数关系,得出答案。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <string> #define ll long long using namespace std; #define N 50007 struct Line { int A,B,C; }line[107]; bool UPLine(Line ka,ll x,ll y) { ll res = ka.A*x + ka.B*y + ka.C; return res > 0; } bool intersection(Line ka,Line kb) { if(ka.A*kb.B == ka.B*kb.A) return false; return true; } string ss[N]; int main() { int t,n,m,i,j; int x,y; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) scanf("%d%d%d",&line[i].A,&line[i].B,&line[i].C); string tmp = ""; for(i=0;i<n;i++) tmp += "0"; for(i=0;i<m;i++) { scanf("%d%d",&x,&y); ss[i] = tmp; for(j=0;j<n;j++) { if(UPLine(line[j],x,y)) ss[i][j] = '1'; } } int C = n+1; for(i=0;i<n;i++) { for(j=i+1;j<n;j++) if(intersection(line[i],line[j])) C++; } sort(ss,ss+m); int cnt = 1; for(i=1;i<m;i++) { if(ss[i] != ss[i-1]) cnt++; } if(cnt >= C) puts("PROTECTED"); else puts("VULNERABLE"); } return 0; }
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com