幸運兒
Time Limit: 3000ms, Memory Limit: 10000KB , Accepted: 2299, Total Submissions: 3279
Description
遊樂園準備抽獎選擇一批幸運兒童(X個人)進行玩具獎勵,想請你幫忙處理這件事。
這次抽獎是将所有兒童排成一排,然後從一疊卡片的頂部取卡片,卡片号為N;從隊列中由1到N進行報數,每次報到N時,第N個兒童離開隊列,然後下一個兒童再從1開始報數。當報數報到隊列結束的時候,再從一疊卡片的頂部取下一張卡片,再從剩餘的隊列中從第1人開始根據新的卡片号進行報數。最後,隊列中的X個人獲獎。
然而,隻有到了遊戲前的一分鐘才知道有多少兒童參加抽獎。請你編寫程式,基于卡片和隊列中兒童的數量,求出隊列中哪些兒童可以獲獎。可以确定最多用20張卡片。
例如:隊列中有10名兒童,2個幸運位置,卡片号碼為3、5、4、3、2,隊列位置中1和8的兒童可以獲獎,過程如下:
(1)隊列1、2、3、4、5、6、7、8、9、10,N=10,X=2,卡片次序為3、5、4、3、2、……
(2)3:劃掉3、6、9,剩下1、2、4、5、7、8、10;
(3)5:劃掉7,剩下1、2、4、5、8、10;
(4)4:劃掉5,剩下1、2、4、8、10;
(5)3:劃掉4,剩下1、2、8、10;
(6)2:劃掉2、10,剩下1、8;
Input
第1行先輸入一個整數N(1≤N≤50)給出參加抽獎的兒童人數,再輸入一個整數X(1≤X≤9)給出有多少個幸運位置。
第2行輸入20個整數給出前20張卡片上的号碼,卡片号碼為1~11的整數,用空格隔開。
Output
輸出幸運位置清單,用空格隔開。
- Sample Input
10 2 3 5 4 3 2 9 6 10 10 6 2 6 7 3 4 7 4 5 3 2
- Sample Output
1 8
#include<stdio.h>
#include<string.h>
int main()
{
int m,n,c[21],i;
scanf("%d%d",&m,&n) ;
for(i=1;i<=20;i++)
{
scanf("%d",&c[i]);
}
int j,k,b[51],p,q,t;
for(i=1;i<=m;i++)//為這m個孩子賦初值,若被篩掉,則該值變為0
{
b[i]=1;
}
for(i=1;i<=20;i++)
{
p=c[i];
k=0;
for(j=1;j<=m;j++)
{
t=0;
if(b[j]!=0)k++;
if(k==p)b[j]=0,k=0;
for(q=1;q<=m;q++)
{
if(b[q]==1)t++;
}
if(t==n)goto L;//若此時隻剩下n個人則跳出循環
}
}
L: for(i=1;i<=m;i++)
{
if(b[i]==1)printf("%d ",i);
}
}