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 |
求救,2184我觉着这是用转化的想法写的,但还是超时.请高人指点 #include<iostream.h> struct cows { short s,f; }; struct cows cow[100]; short n,num; void main() { //fstream cin; //cin.open("input.txt",ios::in); cin>>num; n=0; short xh1; int ts,tf; ts=0; tf=0; for (xh1=0;xh1<num;xh1++) { cin>>cow[n].s>>cow[n].f; if (cow[n].s>=0 && cow[n].f>=0) { ts+=cow[n].s; tf+=cow[n].f; continue; } if (cow[n].s<=0 && cow[n].f<=0) continue; if (cow[n].s+cow[n].f>=0) if (cow[n].s>0) { ts+=cow[n].s; tf=tf+cow[n].f; cow[n].s*=-1; cow[n].f*=-1; n++; } else { ts=ts+cow[n].s; tf+=cow[n].f; cow[n].s*=-1; cow[n].f*=-1; n++; } else n++; } //读入完成 if (n==0) { cout<<ts+tf<<endl; return; } if (ts>=0 && tf>=0) { cout<<ts+tf<<endl; return; } //先把一些情况输出 //prework finished short cho[100]; short top; int MAX=0; top=0; cho[top]=-1; while (top>=0) //找去掉那些奶牛可使问题有解 { if (top==n) { top--; ts=ts-cow[cho[top]].s; tf=tf-cow[cho[top]].f; continue; } cho[top]++; if (cho[top]==n) { top--; ts=ts-cow[cho[top]].s; tf=tf-cow[cho[top]].f; continue; } ts+=cow[cho[top]].s; tf+=cow[cho[top]].f; if (ts>=0 && tf>=0) //剪枝条件1,有可行解 { if (MAX<ts+tf) MAX=ts+tf; ts=ts-cow[cho[top]].s; tf=tf-cow[cho[top]].f; continue; } if (ts+tf<MAX) //剪枝条件2,不可能有更好的解 { ts=ts-cow[cho[top]].s; tf=tf-cow[cho[top]].f; continue; } top++; cho[top]=cho[top-1]; } cout<<MAX<<endl; // cin.close(); } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator