17行代码AC——习题5-3 卡片游戏(Throwing cards away I, UVa 10935,约瑟夫环)_解题报告
生活随笔
收集整理的這篇文章主要介紹了
17行代码AC——习题5-3 卡片游戏(Throwing cards away I, UVa 10935,约瑟夫环)_解题报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
勵志用少的代碼做高效的表達
題目(提交)鏈接→UVa-10935
本題為水題,因此側重點由解題轉向優化。
解題思路:
解法一思路:用vector動態數組存儲,可以方便的實現插入、刪除等操作。
解法二思路:用數組存儲,模擬插入、刪除等操作。
后知后覺:此題本質是模擬隊列輸出(因為操作都在頭部),STL_queue容器解題最佳。 當然,用vector效率相同。
注意:
1、n=1時 Discarded cards:也是輸出的,冒號后沒空格。(還是挺坑的。)
2、涉及到刪除操作最好用數組模擬刪除,不要用容器,因為容器刪除涉及到迭代器,很麻煩,本題中只用到了頭部刪除,因此也可以考慮使用vector的刪除操作解題。
解法一代碼:
#include<bits/stdc++.h> using namespace std; int main() {int n; while((cin >> n) && n) {vector<int>v; //聲明a數組,賦0 for(int i = 1; i <= n; i++) v.push_back(i); //a數組賦值 cout << "Discarded cards:";while(v.size() >= 2) {(v.size()==2) ? cout<<' '<<v[0] : cout<<' '<<v[0]<<","; //若序列長=2則不輸出逗號 v.erase(v.begin()); //刪除v[0] v.push_back(v[0]); v.erase(v.begin()); //v[1]放到序列后 }cout << endl << "Remaining card: " << v[0] << endl; }return 0; }解法二代碼:
(PS:五個月后二刷,只用了數組就解出來了,這兩種方法效率都挺高的,用什么就仁者見仁智者見智了。)
#include<iostream> int n, a[110]; using namespace std; int main() {while(cin>>n && n) {for(int i = 1; i <= n; i++) a[i] = i;int left = n; left--; //需要執行n-1步int p1 = 1; //從1開始 cout << "Discarded cards:"; //注意這里冒號后沒有空格 while(left) { //執行n-1步 left--; cout << ' ' << a[p1] << (left?",":"");a[n+1] = a[p1+1]; //把后一位挪到最后 p1+=2; n+=1; //更新p1和數組長度n }cout << endl << "Remaining card: " << a[p1] << endl; } return 0;}撥云見日,未來可期。
總結
以上是生活随笔為你收集整理的17行代码AC——习题5-3 卡片游戏(Throwing cards away I, UVa 10935,约瑟夫环)_解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 21行代码AC——例题5-2 Ducci
- 下一篇: 14行代码AC——习题5-4 交换学生(