ブルーブリッジカップの試験問題のアルゴリズムは書院の司会者C/C++を高めます


試験問題アルゴリズムは書院の司会者を高める
資源制限時間制限:1.0 sメモリ制限:256.0 MB問題は北京大学附中書院にm人の同級生がいることを説明し、彼らは毎回民主的に多くのことを決定している.ロバートの議事規則によると、司会者が必要です.学生たちは民主意識が強く、積極性が高く、司会者になりたいと思っています.もちろん司会者は一人しかいません.司会者を選ぶために、彼らは一つの方法を考えて民主的だと思っています.方法は:みんなで囲んで、1からmまで同級生ごとに番号をつけます.そして1からカウントし、nのアウトまで数えます.残りの生徒は下位から1から数え始める.最後に残ったのは司会者です.今すでに学友を1からmまで番号をつけて、そして新聞数のnのアウトを約束して、プログラミングして計算してもらって、どの番号の学友が司会者になることができます.1行のフォーマットを入力し、スペースで区切られた2つの整数m nを入力します.出力フォーマットは整数で、司会者の番号サンプル入力15 3サンプル出力5サンプル入力200 55サンプル出力93データ規模と約束10000>m>0を表す.100>n>0; 制限時間1.0秒
考え方:本題はまず1つの変数で数を記録し、nに等しいときは番号を0に変更して記憶し、ずっと加算し、nに等しいときは数を再開してもよいし、再開しなくても判断条件を変更しなければならない.nに対して余剰を0にすればよいが、番号mに遍歴するときは開始したばかりの数になって遍歴し続ける.最後の0でない数だけ残って出力すればいい.
コードは次のとおりです.
#include
#include
using namespace std;
int main(){
     
	int a[10002],i=1,m,n,j=0,sum=0;
	cin>>m>>n;
	memset(a,1,sizeof(a));
	i=1;
	while(1){
     
		if(a[i]!=0){
     
			j++;
		}
		if(j==n){
     
			a[i]=0;
			j=0;
			sum++;
		}
		i++;
		if(i>m){
     
			i=1;
		}
		if(sum==(m-1)){
     
			break;
		}
	}
	for(i=1;i<=m;i++){
     
		if(a[i]!=0){
     
			cout<<i;
			break;
		}
	}
}