poj 2653 Pick-up sticks

额,看不懂题意,我以为是求一个凸壳之类的东西。。瞬间就吓虚了。。

其实就是搞一个和后面的线段没有交点就行。。。23333

而且还是随便暴力,,,,,2333扒了一发题解压压惊2333

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #define N 100005
 5 #define inf 0x3f3f3f3f
 6 #define eps 1e-8
 7 using namespace std;
 8 int ans[N],cnt,n;
 9 bool cov[N];
10 struct point{double x,y;};
11 struct line{point a,b;}a[N];
12 point vec(point a, point b)
13 {
14     point t; t.x=a.x-b.x; t.y=a.y-b.y; return t;
15 }
16 double cross(point a, point b)
17 {
18     return a.x*b.y-a.y*b.x;
19 }
20 double turn(point p1, point p2, point x)
21 {
22     return cross(vec(x,p1),vec(p2,p1));
23 }
24 bool cover(int i, int j)
25 {
26     if (turn(a[i].a,a[i].b,a[j].a)*turn(a[i].a,a[i].b,a[j].b)>0) return 0;
27     if (turn(a[j].a,a[j].b,a[i].a)*turn(a[j].a,a[j].b,a[i].b)>0) return 0;
28     return 1;
29 }
30 void solve()
31 {
32     printf("Top sticks: "); cnt=0;
33     for (int i=1; i<=n; i++)
34     {
35         bool flag=0;
36         for (int j=i+1; j<=n; j++)
37         {
38             if (cover(i,j)) {flag=1; break;}
39         }
40         if (!flag) ans[++cnt]=i;
41     }
42     for (int i=1; i<cnt; i++) printf("%d, ",ans[i]);
43     printf("%d",ans[cnt]);
44     puts(".");
45 }
46 int main()
47 {
48     while (scanf("%d",&n) && n)
49     {
50         for (int i=1; i<=n; i++)
51             scanf("%lf%lf%lf%lf",&a[i].a.x,&a[i].a.y,&a[i].b.x,&a[i].b.y);
52         solve();
53     }
54     return 0;
55 }
原文地址:https://www.cnblogs.com/ccd2333/p/6480846.html