还没打完,先放着
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 }