<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">链接:</span><a target=_blank href="http://poj.org/problem?id=1873" target="_blank" style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">http://poj.org/problem?id=1873</a>
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 5582 | Accepted: 1591 |
Description
Input
Output
Sample Input
6 0 0 8 3 1 4 3 2 2 1 7 1 4 1 2 3 3 5 4 6 2 3 9 8 3 3 0 10 2 5 5 20 25 7 -3 30 32 0
Sample Output
Forest 1 Cut these trees: 2 4 5 Extra wood: 3.16 Forest 2 Cut these trees: 2 Extra wood: 15.00
Source
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include<queue> #include<set> #include<map> #include<stack> #include<cmath> #define mst(ss,b) memset((ss),(b),sizeof(ss)) #define maxn 0x3f3f3f3f using namespace std; int n,m,k,bbb=0; double ansv,ansl,ansn; struct point { double x,y,v,l; point(double x=0,double y=0):x(x),y(y) {} } s[22],p[22],tr[22]; int vis[22],anw[22]; const double eps=1e-8; typedef point vec; vec operator - (point a,point b) { return vec(a.x-b.x,a.y-b.y); } int dcmp(double x) { if(fabs(x)<=eps) return 0; else return x<0?-1:1; } double cross(vec a,vec b) { return a.x*b.y-a.y*b.x; } double disn(point a,point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } bool cmp(point a,point b) { if(fabs(a.x-b.x)<=eps) return a.y<b.y; return a.x<b.x; } void convexhull() { sort(p,p+k,cmp); m=0; for(int i=0; i<k; i++) { while(m>1 && dcmp(cross(tr[m-1]-tr[m-2],p[i]-tr[m-2]))<=0) m--; tr[m++]=p[i]; } int t=m; for(int i=k-2; i>=0; i--) { while(m>t && dcmp(cross(tr[m-1]-tr[m-2],p[i]-tr[m-2]))<=0) m--; tr[m++]=p[i]; } } void dfs(int u,int num) { if(u<n) { vis[u]=0; dfs(u+1,num); vis[u]=1; dfs(u+1,num+1); return ; } if(num==0 || num==n) return ; double sumv=0,suml=0,need=0; for(int i=0; i<n; i++) { if(vis[i]) { suml+=s[i].l; sumv+=s[i].v; } } if(sumv>ansv) return ; k=0; for(int i=0; i<n; i++) { if(vis[i]) continue; p[k].x=s[i].x; p[k].y=s[i].y; k++; } if(k==1) need=0; else if(k==2) need=2*disn(p[0],p[1]); else { convexhull(); need=0; for(int i=0; i<m-1; i++) { need+=disn(tr[i],tr[i+1]); } } if(need<=suml) { ansv=sumv; ansl=suml-need; ansn=num; int ll=0; for(int i=0; i<n; i++) { if(vis[i]) { anw[ll]=i+1; ll++; } } } } int main() { int cas=1; while(scanf("%d",&n)!=EOF) { if(n==0) break; for(int i=0; i<n; i++) { scanf("%lf%lf%lf%lf",&s[i].x,&s[i].y,&s[i].v,&s[i].l); } ansv=maxn; ansl=ansn=0; mst(vis,0); dfs(0,0); printf("Forest %d\nCut these trees: ", cas ++); for(int i = 0; i < ansn; i ++) printf("%d ", anw[i]); printf("\nExtra wood: %.2f\n\n", ansl); } return 0; }