算法竞赛入门经典(第二版) | 例题4-3 救济金发放 (UVa133,The Dole Queue)
生活随笔
收集整理的這篇文章主要介紹了
算法竞赛入门经典(第二版) | 例题4-3 救济金发放 (UVa133,The Dole Queue)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
提目(提交)鏈接→UVa-133
百度翻譯→百度翻譯
沒(méi)使用過(guò)該網(wǎng)站的同學(xué)請(qǐng)猛戳這里→vJudge教程
分析:
最開(kāi)始的固有思維是循環(huán)就用循環(huán)鏈表,其實(shí)完全可以把它看成一個(gè)大一點(diǎn)的周期類型題(一個(gè)大周期),用數(shù)組+求余即可解決。唯一需要注意的是:循環(huán)需要同時(shí)滿足順、逆時(shí)針兩種需要(見(jiàn)第十行代碼)。
代碼:
#include<iostream> #include<cstdio> #define maxn 25 int n, k, m, a[maxn];//逆時(shí)針走t步,步長(zhǎng)是d(-1表示順時(shí)針走),返回新位置 int go(int p, int d, int t) {while(t--) {//核心代碼:如果按正常的取余:(p+d)%n,想從1順時(shí)針變成10是不可能的。這里的+n-1目的是防止變成0, do { p = (p+d+n-1) % n + 1; } while(a[p] == 0); //走到下一個(gè)非0數(shù)字 }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; //還剩下的人數(shù)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 ; //相當(dāng)于刪除if(left) printf(","); } printf("\n"); }return 0; }收獲:
1、這道題唯一的難點(diǎn)就是那段取余的核心代碼,也就是同時(shí)滿足1->n與n->1的情況,不得不說(shuō),紫皮書(shū)牛批!
2、我們要摸透出題人的心思,試想:如果我們是出題人,出了一道大水題,會(huì)讓它又臭又長(zhǎng)或是用復(fù)雜的函數(shù)嗎? 不會(huì)。所以做這種題千萬(wàn)千萬(wàn)不要想得太復(fù)雜。 想清楚這個(gè)問(wèn)題,你會(huì)發(fā)現(xiàn)很多題變得如此簡(jiǎn)單。
最后分享一條大牛的建議(對(duì)筆者受益匪淺):算法最好有人帶著學(xué),如果條件不允許,一定要到網(wǎng)絡(luò)上廣泛交流、學(xué)習(xí)。
總結(jié)
以上是生活随笔為你收集整理的算法竞赛入门经典(第二版) | 例题4-3 救济金发放 (UVa133,The Dole Queue)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 算法竞赛入门经典(第二版) | 例题4-
- 下一篇: 算法竞赛入门经典(第二版) | 例题4-