日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

17行代码AC——习题5-3 卡片游戏(Throwing cards away I, UVa 10935,约瑟夫环)_解题报告

發布時間:2024/2/28 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,约瑟夫环)_解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。