题目链接:点击打开链接
5 1 1 4 2 2 3 3 1 1 -2.0 8 4 1 4 8 2 3 3 6 -2.0 3 0 0 1 1 1 0 2 1 2 0 3 1 0
Top sticks: 2, 4, 5. Top sticks: 1, 2, 3.
思路:枚举木棍,求出没有被覆盖的木棍条数。
代码:第一个655ms,第二个超时了。我觉得两个应该差不多,都是O(n²),可能是数据的原因。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 100010 struct Line { double x1,y1,x2,y2; } line[N]; struct Node { double x,y; }; int anss[N]; double ans(Node a,Node b) { return a.x*b.y-a.y*b.x; } int check(Line a,Line b) { if(!(min(a.x1,a.x2)<=max(b.x1,b.x2)&&min(a.y1,a.y2)<=max(b.y1,b.y2)&& min(b.x1,b.x2)<=max(a.x1,a.x2)&&min(b.y1,b.y2)<=max(a.y1,a.y2))) return 0; Node p1q1,p2q1,q1p1,q2p1,q2q1,p2p1; p1q1.x=a.x1-b.x1; p1q1.y=a.y1-b.y1; p2q1.x=a.x2-b.x1; p2q1.y=a.y2-b.y1; q1p1.x=b.x1-a.x1; q1p1.y=b.y1-a.y1; q2p1.x=b.x2-a.x1; q2p1.y=b.y2-a.y1; q2q1.x=b.x2-b.x1; q2q1.y=b.y2-b.y1; p2p1.x=a.x2-a.x1; p2p1.y=a.y2-a.y1; if(ans(p1q1,q2q1)*ans(p2q1,q2q1)>0) return 0; if(ans(q1p1,p2p1)*ans(q2p1,p2p1)>0) return 0; return 1; } int main() { int n,cnt; while(~scanf("%d",&n)&&n) { cnt=0; for(int i=0; i<n; i++) scanf("%lf %lf %lf %lf",&line[i].x1,&line[i].y1,&line[i].x2,&line[i].y2); for(int i=0; i<n; i++) { int flag=1; for(int j=i+1; j<n; j++) if(check(line[i],line[j])) { flag=0; break; } if(flag) anss[cnt++]=i+1; } printf("Top sticks: "); printf("%d",anss[0]); for(int i=1; i<cnt; i++) printf(", %d",anss[i]); printf(".\n"); } return 0; }
</pre><pre style="font-family: 'Courier New'; background-color: rgb(244, 251, 255);">
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 100010 struct Line { double x1,y1,x2,y2; }line[N]; struct Node { double x,y; }; int flag[N]; double ans(Node a,Node b) { return a.x*b.y-a.y*b.x; } int check(Line a,Line b) { if(!(min(a.x1,a.x2)<=max(b.x1,b.x2)&&min(a.y1,a.y2)<=max(b.y1,b.y2)&& min(b.x1,b.x2)<=max(a.x1,a.x2)&&min(b.y1,b.y2)<=max(a.y1,a.y2))) return 0; Node p1q1,p2q1,q1p1,q2p1,q2q1,p2p1; p1q1.x=a.x1-b.x1; p1q1.y=a.y1-b.y1; p2q1.x=a.x2-b.x1; p2q1.y=a.y2-b.y1; q1p1.x=b.x1-a.x1; q1p1.y=b.y1-a.y1; q2p1.x=b.x2-a.x1; q2p1.y=b.y2-a.y1; q2q1.x=b.x2-b.x1; q2q1.y=b.y2-b.y1; p2p1.x=a.x2-a.x1; p2p1.y=a.y2-a.y1; if(ans(p1q1,q2q1)*ans(p2q1,q2q1)>0) return 0; if(ans(q1p1,p2p1)*ans(q2p1,p2p1)>0) return 0; return 1; } int main() { int n; while(~scanf("%d",&n)&&n) { memset(flag,0,sizeof(flag)); for(int i=0;i<n;i++) { scanf("%lf %lf %lf %lf",&line[i].x1,&line[i].y1,&line[i].x2,&line[i].y2); for(int j=0;j<i;j++) { if(!flag[j]&&check(line[j],line[i])) flag[j]=1; } } int num=0; printf("Top sticks: "); for(int i=0;i<n;i++) { if(!flag[i]) { if(num) printf(", "); printf("%d",i+1); num=1; } } printf(".\n"); } return 0; }