[Poj 1873] convex hull plus enumeration

Is still being waged, first stood

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=20;
 4 #define eps 1e-8
 5 #define inf 0x3f3f3f3f
 6 int sgn(double x){
 7     if(fabs(x)<eps) return 0;
 8     if(x<0) return -1;
 9     return 1;
10 } 
11 struct Point{
12     double x,y,l;
13     int v;
14     Point operator - (const Point& b)const{
15         return (Point){x-b.x,y-b.y};
16     }
17     double operator ^ (const Point& b)const{
18         return x*b.y-b.x*y; 
19     }
20 }p[N],a[N],p0;
21 int sta[N];
22 int n;
23 bool vis[N];        
24 double dist(Point a,Point b){
25     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
26 }          
27 bool cmp(Point a,Point b){
28     if(atan2(a.y-p0.y,a.x-p0.x)!=atan2(b.y-p0.y,b.x-p0.x)){
29         return (atan2(a.y-p0.y,a.x-p0.x)<atan2(b.y-p0.y,b.x-p0.x));        
30     }
31     return a.x<b.x;
32 }   
33 double graham(int cnt){
34     if(cnt<2) return 0;
35     if(cnt==2) return dist(a[1],a[2]);
36     p0=a[1];
37     int k=1;
38     for(int i=2;i<=cnt;++i){
39         if((p0.y > a[i].y) || (p0.y==a[i].y && p0.x>a[i].x)){
40             p0=a[i];
41             k=i;
42         }
43     }
44     a[k]=a[1];
45     a[1]=p0;
46     sort(a+2,a+1+cnt,cmp);
47     sta[0]=1; sta[1]=2;
48     int top=1;
49     for(int i=3;i<=n;++i){
50         while(top>0&&((a[i]-a[sta[top-1]])^(a[sta[top]]-a[sta[top-1]])) <= 0) --top;
51         sta[++top]=i;
52     }
53     double ans=0;
54     for(int i=0;i<top;++i) ans+=dist(a[sta[i]],a[sta[i+1]]);
55     ans+=dist(a[sta[0]],a[sta[top]]);
56     return ans;
57 }               
58 int ans[N];
59 int main(){
60     int n; 
61     int cas=0;
62     while(~scanf("%d",&n) && n){
63         for(int i=0;i<n;++i) scanf("%lf %lf %d %lf",&p[i].x,&p[i].y,&p[i].v,&p[i].l);
64         int ansv=inf,ansn=inf,anslef;
65         for(int i=0;i<(1<<n);++i){
66             memset(vis,0,sizeof(vis));
67             int temv=0,temn=0;
68             double teml=0;
69             int cnt=0;
70             for(int j=0;j<n;++j){
71                 if((1<<j) & i){
72                     vis[j]=1;
73                     ++temn;
74                     temv+=p[j].v;
75                     teml+=p[j].l;
76                 }
77                 else a[++cnt]=p[j];
78             }
79             if(temv > ansv || (temv==ansv && temn > ansn)) continue;
80             double used=graham(cnt);
81             if(used <= teml){
82                 ansv=temv;
83                 anslef=teml-used;
84                 ansn=0;
85                 for(int u=1;u<=n;++u) if(vis[u]) ans[++ansn]=u;
86             }
87         }
88         printf("Forest %d\n",++cas);
89         printf("Cut these trees: ");
90         for(int i=1;i<=ansn;++i) printf("%d ",ans[i]);
91         printf("\n");
92         printf("Extra wood: %.2lf\n",ansv);
93         puts("");
94     }
95 } 
View Code

 

Guess you like

Origin www.cnblogs.com/xiaobuxie/p/11570007.html