算法竞赛入门经典(第二版) | 例题4-3 救济金发放 (UVa133,The Dole Queue)
生活随笔
收集整理的這篇文章主要介紹了
算法竞赛入门经典(第二版) | 例题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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法竞赛入门经典(第二版) | 例题4-
- 下一篇: 算法竞赛入门经典(第二版) | 例题4-