HDU-1147-Pick-up sticks
2015-07-14 12:25
337 查看
#include<iostream> #include<string> #include<queue> #include<map> #include<set> #include<vector> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; /* 这道题其实和1086是一样的题目,都是判断线段是否相交; 但是这道题换了一个问你的方式;他告诉你他依次放木棍的次序; 并且告诉你木棍的坐标,问你没有被压着的木棍有哪几个,并且按先放的先输出; 思路: 因为告诉了你木棍摆放的次序,所以先放的只要和后面的有相交,就说明这根木棍被压着了; 那么我们就可以转换成判断是否相交来判断是否是Top了; */ typedef struct { double x,y; }Point; // 判断直线AB是否与线段CD相交; bool Intersect(Point A,Point B,Point C,Point D) { // 直线方程F(x,y)为:(y-y1)*(x1-x2)-(x-x2)*(y1-y2)=0; double FC=(C.y-A.y)*(A.x-B.x)-(C.x-A.x)*(A.y-B.y); double FD=(D.y-A.y)*(A.x-B.x)-(D.x-A.x)*(A.y-B.y); if(FC*FD<=0) return true; else return false; } Point a[100005],b[100005]; int main() { int n; while(~scanf("%d",&n)){ if(!n) break; int TopSticks[1005]; // 存放没有被压着的木棍; int c=0; for(int i=0;i<n;i++) scanf("%lf%lf%lf%lf",&a[i].x,&a[i].y,&b[i].x,&b[i].y); for(int i=0;i<n-1;i++){ int flag=1; for(int j=i+1;j<n;j++){ // 如果有相交,那么标记为0,直接查找下一个, if(Intersect(a[i],b[i],a[j],b[j])&&Intersect(a[j],b[j],a[i],b[i])){ flag=0; break; } } if(flag) TopSticks[c++]=i+1; } printf("Top sticks: "); for(int i=0;i<c;i++){ printf("%d, ",TopSticks[i]); } // 因为最后一根木棍肯定是没有被压着的,所以我们在第40行就没有考虑最后一根木棍; printf("%d.\n",n); } return 0; }
相关文章推荐
- 虚幻4创建自己的UMG类别
- object-c中对文件操作
- 根据一段代码理清一些变量,常量,数组,指针的关系及理解
- 解读AFNetworking中Demo的MVC
- C 判断路径存在
- 七天学会ASP.NET MVC (六)――线程问题、异常处理、自定义URL
- 浅析MVC和说媒的过程
- hdu 1284 钱币兑换问题
- Eclipse 如何同时打开查看多个文件
- 一个点的经度和纬度,以这个点为圆心,1000米为半径,最大的经度和纬度,最小的经度和纬度
- xcode项目编译C/C++文件could not build module foundation
- hdu 1284 钱币兑换问题
- mongodb数据库的启动和停止
- 分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。
- ubuntu14.04 64bit安装skype4.3
- 公钥、私钥、SSL趣解
- IOS开发点滴---UIView转UIImage以及切割UIView
- hdu 1248 寒冰王座
- Ubuntu通过源码编译安装Octave 4.0
- hdu 1248 寒冰王座