Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:是WA,高手麻烦指点一下...In Reply To:是WA,高手麻烦指点一下... Posted by:luckystar at 2007-08-26 20:16:40 > #include<iostream> > using namespace std; > /*最优化剪枝:如果当前搜到的s+f的值加上后面最多能达到的s+f的值小于已经搜得的最大值,就退出; > 可行性剪枝:如果当前搜到的s(或f)值<0,那么如果s(或f)加上后面最多能得到的s(或f)值<0,就退出。*/ > struct point > { > int x,y; > }; > int max; > int ms,mx,my; > point p[101]; > int mins[101],minx[101],miny[101]; > int j; > > int cmp(const void *a, const void *b) > { > return((*(point *)b).x+(*(point *)b).y)-((*(point *)a).x+(*(point *)a).y); > } > > void dfs(int i,int s,int x,int y)//i表示搜到第几点。 > { > if(s>max&&x>=0&&y>=0) > max=s; > if(i==j) > return ; > if(s+mins[i]<max)//剪枝 > return ; > if(x<0&&x+minx[i]<0)//剪枝 > return ; > if(y<0&&y+miny[i]<0)//剪枝 > return ; > > dfs(i+1,s,x,y); > dfs(i+1,s+p[i].x+p[i].y,x+p[i].x,y+p[i].y); > } > > main() > { > > int i,k,n,a,b; > cin>>n; > j=0; > max=0; > ms=0;mx=0; > my=0; > for(i=0;i<n;i++) > { > cin>>a>>b; > if(a>=0&&b>=0&&a+b>0) > { > mx+=a; > my+=b; > ms=ms+a+b; > } > else if(a+b>0) > { > p[j].x=a; > p[j].y=b; > j++; > } > } > qsort(p, j, sizeof(point), cmp); > mins[j-1]=p[j-1].x+p[j-1].y;//求后面最多能达到的s+f的值,和后面最多能得到的s(或f)值 > if(p[j-1].x>0) > minx[j-1]=p[j-1].x; > else > minx[j-1]=0; > if(p[j-1].y>0) > miny[j-1]=p[j-1].y; > else > miny[j-1]=0; > for(k=j-2;k>=0;k--) > { > if(p[k].x>0) > minx[k]=p[k].x+minx[k+1]; > else > minx[k]=minx[k+1]; > if(p[k].y>0) > miny[k]=p[k].y+miny[k+1]; > else > miny[k]=miny[k+1]; > mins[k]=p[k].x+p[k].y+mins[k+1]; > } > dfs(0,ms,mx,my); > cout<<max<<endl; > return 0; > } > Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator