題目背景
約瑟夫是一個無聊的人!!!
題目描述
n個人(n<=100)圍成一圈,從第一個人開始報數,數到m的人出列,再由下一個人重新從1開始報數,數到m的人再出圈,……依次類推,直到所有的人都出圈,請輸出依次出圈人的編號.
輸入輸出格式
輸入格式:n m
輸出格式:出圈的編號
輸入輸出樣例
輸入樣例#1:
10 3
輸出樣例#1:
3 6 9 2 7 1 8 5 10 4
說明
你猜,你猜,你猜猜猜......
猜不著吧,我也不告訴你!!!‘
我確信我的是對的
但是不知道為什麼會超時
跟填塗顏色那題一樣
明明在自己機子上秒出但是超時??
1 #include<cstdio> 2 #include<cstring> 3 const int MAXN=10001; 4 int vis[MAXN]; 5 int flag=0; 6 int main() 7 { 8 int n,m; 9 scanf("%d%d",&n,&m); 10 int tot=0; 11 int i=1;//有幾個人報數 12 int now=1;// 正在列舉第幾個人 13 while(tot<n) 14 { 15 while(vis[now+1]==0&&i<m&&now<n){i++;now++;} 16 if(i==m) 17 { 18 tot++; 19 i=0; 20 vis[now]=1; 21 printf("%d ",now); 22 continue; 23 } 24 while(vis[now+1]!=0) 25 {now=now++;if(vis[now]==0)i++;} 26 27 if(now==n)now=0; 28 } 29 return 0; 30 }
1 #include<iostream> 2 using namespace std; 3 int n,m; 4 bool out[102];//out[i]:記錄點i是否已經出圈,為true則已出圈,之後迴圈需要跳過i;false則表示還未出圈 5 int main() 6 { 7 scanf("%d%d",&n,&m); 8 int cnt=0,now=0,tot=0;//cnt:當前數的數 now:當前輪到第幾個人 tot:已出圈人數,用來在達到條件時結束迴圈(等於總人數n) 9 while(tot!=n) 10 { 11 cnt++;now++; 12 if(cnt==m+1)//迴圈處理,形成一個環 13 cnt=1; 14 if(now==n+1)//同上 15 now=1; 16 while(out[now])//當now這個人已經出圈時,應跳過now,直到找到下個未出圈的人(out[now]=false) 17 { 18 ++now; 19 if(now==n+1)//形成環 20 now=1; 21 } 22 if(cnt==m)//當前數到m,now出圈,總出圈人數+1 23 out[now]=1,++tot,printf("%d ",now); 24 } 25 return 0; 26 }