【模拟】小游戏
小游戲
題目大意:
有n個數形成一個環,從第S個開始,先往后數N個數然后把這個數取出來,再往前數K個數把這個數取出來,問取的數字依次是什么
原題:
題目描述
【題目背景】
yk同學是一個灰常灰常有愛的同學,雖然各種老師總是讓他干看似很無聊的事情,但是他總是發明一些好玩的辦法來完成這些無聊的任務,這樣yk就不會整天那么憂郁啦~ 這次,老師又給他布置了一個任務,讓他搬凳子~~ 當然他非常有愛地把這個任務發展成了一個小小小游戲~ hoho,現在他讓你來玩這個小游戲,have a try~
【題目描述】
現在有M個凳子排成一個圈,我們順時針給凳子依次編號為1,2,3……,M。我們從編號為S的凳子開始,每次先順時針數N個凳子,將第N個凳子搬走,然后再逆時針數K個凳子,將第K個凳子搬走。每次都這樣先順時針數N個,再逆時針數K個,直到只剩1個凳子,直接搬走。最后,我們想知道M個凳子的搬走順序。
輸入
共4行,每行1個數,分別表示題目中的M,S,N,K。
輸出
僅一行,凳子搬走的序列,每個編號間有一個空格。
輸入樣例
8 1 3 2輸出樣例
3 1 5 2 7 4 6 8說明
【數據范圍】
100% M<=1000
解題思路:
直接枚舉就行了
代碼:
#include<cstdio> using namespace std; int n,m,k,l,o,nn,p[1005]; int main() {scanf("%d %d %d %d",&n,&m,&k,&l);for (int i=1;i<=n;++i)p[i]=1;k=(k-1)%n+1;//走了一環的就刪掉l=(l-1)%n+1;o=m-1;nn=n;while (nn){for (int i=1;i<=k;++i){o++;//累加if (o>n) o=1;//到達邊界while (!p[o])//不在了{o++;if (o>n) o=1;}}p[o]=0;//刪掉printf("%d ",o);//輸出nn--;//少一個if (!nn) break;//如果for (int i=1;i<=l;++i){o--;//往左走if (!o) o=n;while (!p[o]){o--;if (!o) o=n;}}p[o]=0;//同上printf("%d ",o);nn--;} }總結
- 上一篇: 【DP】Sam数
- 下一篇: 安藤忠雄的著作及作品有哪些