試題 算法訓練 篩選號碼---藍橋杯

試題 算法訓練 篩選號碼

題目描述:

資源限制
時間限制: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章