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 |
只能做到16ms了,各位大牛帮忙看看还有哪能优化,附代码Source Code Problem: 1143 User: yzhw Memory: 8484K Time: 16MS Language: C++ Result: Accepted Source Code # include <iostream> # include <vector> # include <cstring> using namespace std; int refer[2100000]; void decode(int num,bool ans[]) { for(int i=20;i>=1;i--) { ans[i]=num%2; num/=2; } } int encode(bool pos[]) { int ans=0; for(int i=20;i>=1;i--) { ans+=pos[i]*(1<<(20-i)); } return ans; } void change(bool tar[],int pos) { for(int i=pos;i<=20;i+=pos) { tar[pos]=0; for(int j=2;j<=20;j++) if(j+i<=20) { if(tar[j]==0) tar[i+j]=0; } else break; } } int deal(int pos) { if(refer[pos]) return refer[pos]; else if(pos==0) return 3; else { bool array[21]; decode(pos,array); bool tmp[21]; bool flag=false,flag1=true; for(int i=2;i<=20;i++) { memcpy(tmp,array,sizeof(tmp)); if(tmp[i]==1) { change(tmp,i); if(deal(encode(tmp))==3) flag=true,flag1=false; else if(deal(encode(tmp))==1) flag1=false; } } if(flag) refer[pos]=2; else if(flag1) refer[pos]=3; else refer[pos]=1; return refer[pos]; } } int main() { bool ori[21]; int num,co=1; memset(refer,0,sizeof(refer)); refer[0]=3; while(cin>>num) { if(!num) break; vector<int> ans; memset(ori,0,sizeof(ori)); for(int i=1;i<=num;i++) { int t; cin>>t; ori[t]=1; } cout<<"Test Case #"<<co++<<endl; deal(encode(ori)); for(int i=2;i<=20;i++) if(ori[i]) { bool tmp[21]; memcpy(tmp,ori,sizeof(tmp)); change(tmp,i); if(refer[encode(tmp)]==3) ans.push_back(i); } if(ans.size()==0) cout<<"There's no winning move."<<endl<<endl; else { cout<<"The winning moves are:"; for(int i=0;i<ans.size();i++) cout<<" "<<ans[i]; cout<<endl<<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