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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

算法竞赛入门经典(第二版) | 例题4-3 救济金发放 (UVa133,The Dole Queue)

發布時間:2024/2/28 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法竞赛入门经典(第二版) | 例题4-3 救济金发放 (UVa133,The Dole Queue) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提目(提交)鏈接→UVa-133

百度翻譯→百度翻譯

沒使用過該網站的同學請猛戳這里→vJudge教程


分析:

最開始的固有思維是循環就用循環鏈表,其實完全可以把它看成一個大一點的周期類型題(一個大周期),用數組+求余即可解決。唯一需要注意的是:循環需要同時滿足順、逆時針兩種需要(見第十行代碼)。

代碼:
#include<iostream> #include<cstdio> #define maxn 25 int n, k, m, a[maxn];//逆時針走t步,步長是d(-1表示順時針走),返回新位置 int go(int p, int d, int t) {while(t--) {//核心代碼:如果按正常的取余:(p+d)%n,想從1順時針變成10是不可能的。這里的+n-1目的是防止變成0, do { p = (p+d+n-1) % n + 1; } while(a[p] == 0); //走到下一個非0數字 }return p; } using namespace std; int main() {while(cin>>n>>k>>m && n) {for(int i = 1; i <= n; i++) a[i] = i; //從1到n。 int left = n; //還剩下的人數int p1 = n, p2 = 1; //P1是尾巴、P2是頭 while(left) {p1 = go(p1, 1, k);p2 = go(p2, -1, m); printf("%3d", p1); left--;if(p2 != p1) { printf("%3d", p2); left--; } a[p1] = a[p2] = 0 ; //相當于刪除if(left) printf(","); } printf("\n"); }return 0; }
收獲:

1、這道題唯一的難點就是那段取余的核心代碼,也就是同時滿足1->n與n->1的情況,不得不說,紫皮書牛批!
2、我們要摸透出題人的心思,試想:如果我們是出題人,出了一道大水題,會讓它又臭又長或是用復雜的函數嗎? 不會。所以做這種題千萬千萬不要想得太復雜。 想清楚這個問題,你會發現很多題變得如此簡單。


最后分享一條大牛的建議(對筆者受益匪淺):算法最好有人帶著學,如果條件不允許,一定要到網絡上廣泛交流、學習。

總結

以上是生活随笔為你收集整理的算法竞赛入门经典(第二版) | 例题4-3 救济金发放 (UVa133,The Dole Queue)的全部內容,希望文章能夠幫你解決所遇到的問題。

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