個人USACO第50題,一個98年ACM區域賽的題,談不上什麼算法,模擬求解。s[i][j][0]表示第i個輪子上第j個缺口的起始角度,s[i][j][1]表示第i個輪子上第j個缺口的長度。時間每增長1s,檢測光線是否能夠穿過全部的輪子,若是是則輸出結果結束;若是否,檢測將本次每一個輪子的第一個缺口的起始角度是否之前曾出現過,若是是,則問題進入死循環,不可能有光線穿過五個輪子,輸出"none"結束;若是否,則將本次每一個輪子的第一個缺口的起始角度存進vec,ans++,繼續循環。這裏題目中說0~180的長度是181,可是編程中若是這樣處理則會錯誤,例如題目中給出的測試例結果爲9,此時第三個輪子的缺口起始角度爲90,長度爲180,按題中的意思,最多能達到的角度爲90+180-1=269,可是答案光線倒是270度,依此,在編程中作出了適當修改。node
修改了題意,抱着試試的態度提交,居然一次經過,並且用時還能夠,激動啊激動,很久沒WORKED FIRST TIME了,難道是爲了記念個人USACO50題?留下截圖,以做記念。ios
USER: jinzhou lee [jzzlee1] TASK: spin LANG: C++ Compiling... Compile: OK Executing... Test 1: TEST OK [0.000 secs, 3340 KB] Test 2: TEST OK [0.000 secs, 3340 KB] Test 3: TEST OK [0.000 secs, 3340 KB] Test 4: TEST OK [0.000 secs, 3340 KB] Test 5: TEST OK [0.000 secs, 3340 KB] Test 6: TEST OK [0.011 secs, 3340 KB] Test 7: TEST OK [0.011 secs, 3340 KB] Test 8: TEST OK [0.032 secs, 3340 KB] All tests OK.YOUR PROGRAM ('spin') WORKED FIRST TIME! That's fantastic -- and a rare thing. Please accept these special automated congratulations.算法
/* ID:jzzlee1 PROB:spin LANG:C++ */ //#include<iostream> #include<fstream> #include<cmath> #include<vector> using namespace std; ifstream cin("spin.in"); ofstream cout("spin.out"); int ans,v[5],w[5],s[5][5][2]; struct node { short a; short b; short c; short d; short e; }; vector<node> vec; bool checkok() { bool flag,sign; for(int k=0;k!=360;k++) { sign=1; for(int i=0;i!=5;i++) { flag=0; for(int j=0;j!=w[i];j++) { if(s[i][j][0]+s[i][j][1]-1<360) { if(k>=s[i][j][0]&&k-s[i][j][0]<=s[i][j][1]) { flag=1; break; } } else { if(k<s[i][j][0]) { if(k+360-s[i][j][0]<s[i][j][1]) { flag=1; break; } } else { if(k-s[i][j][0]<s[i][j][1]) { flag=1; break; } } } } if(!flag) sign=0; } if(sign) return 1; } return 0; } bool checkfail() { vector<node>::iterator iter; for(iter=vec.begin();iter!=vec.end();iter++) { if(iter->a!=s[0][0][0]) continue; if(iter->b!=s[1][0][0]) continue; if(iter->c!=s[2][0][0]) continue; if(iter->d!=s[3][0][0]) continue; if(iter->e!=s[4][0][0]) continue; return 1; } return 0; } int main() { int i,j; for(i=0;i!=5;i++) { cin>>v[i]>>w[i]; for(j=0;j!=w[i];j++) { cin>>s[i][j][0]>>s[i][j][1]; } } while(1) { if(checkok()) { cout<<ans<<endl; break; } for(i=0;i!=5;i++) for(j=0;j!=w[i];j++) s[i][j][0]=(s[i][j][0]+v[i])%360; node dd; dd.a=s[0][0][0]; dd.b=s[1][0][0]; dd.c=s[2][0][0]; dd.d=s[3][0][0]; dd.e=s[4][0][0]; if(checkfail()) { cout<<"none"<<endl; break; } vec.push_back(dd); ans++; } return 0; }