試題 算法訓練 篩選號碼
題目描述:
資源限制
時間限制:1.0s 內存限制:512.0MB
問題描述
有n個人圍成一圈,順序排號(編號爲1到n)。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子。從下一個人開始繼續報數,直到剩下最後一個人,遊戲結束。
問最後留下的是原來第幾號的那位。
舉個例子,8個人圍成一圈:
1 2 3 4 5 6 7 8
第1次報數之後,3退出,剩下:
1 2 4 5 6 7 8 (現在從4開始報數)
第2次報數之後,6退出,剩下:
1 2 4 5 7 8 (現在從7開始報數)
第3次報數之後,1退出,剩下:
2 4 5 7 8 (現在從2開始報數)
第4次報數之後,5退出,剩下:
2 4 7 8 (現在從7開始報數)
第5次報數之後,2退出,剩下:
4 7 8 (現在從4開始報數)
第6次報數之後,8退出,剩下:
4 7 (現在從4開始報數)
最後一次報數之後,4退出,剩下:
7.
所以,最後留下來的人編號是7。
輸入格式
一個正整數n,(1<n<10000)
輸出格式
一個正整數,最後留下來的那個人的編號。
樣例輸入
8
樣例輸出
7
數據規模和約定
對於100%的數據,1<n<10000。
思路很簡單,直接看代碼吧!
AC代碼:
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int a[10000];
int vis[10000];//記錄數據是否訪問過
int main()
{
int n,i;
cin>>n;
memset(vis,0,sizeof(vis));//初始化
for(i=1;i<=n;i++)
a[i]=i;
i=1;
int cnt=0,num=n;
while(i<=n)
{
if(vis[i]==0)
{
cnt++;
if(cnt==3)
{
cnt=0;
vis[i]=1;//記錄訪問過
num--;//剔除掉a[i]
}
}
if(num==1)
break;
if(i==n)
i=1;
else
i++;
}
for(i=1;i<=n;i++)
if(vis[i]==0)
cout<<a[i];
cout<<endl;
return 0;
}