poj1591(ジョセフリングの問題)

M A S * H

制限時間:1000MSメモリ制限:10000K送信
総数:1264承認済み:667
説明

クリンガー伍長は朝鮮戦争の第4077移動軍外科病院の会員です。そして彼は抜け出すために何でもするでしょう。米陸軍は、募集ツアーのために州に戻るために何人かの幸運な人々(X)を選ぶ宝くじの申し出をしました。クリンガーはあなたの助けが必要です。
抽選は、ユニットのすべてのメンバーを注意深く並べ、メンバーを1からNまで数えてメンバーを排除することによって実行されます。ここで、Nはデッキの上部からカードを引き抜くことによって選択された数です。Nに達するたびに、その人はラインから外れ、カウントは1から再開され、次の人がラインになります。ラインの終わりに達すると(どんな数でも)、デッキの一番上の次のカードが取られ、残りのラインの最初の人からカウントが1から再開されます。並んでいる最後のX人は家に帰ります。

クリンガーは、選択プロセスが始まる直前に、スタックされたデッキを実際のデッキと交換する方法を見つけました。しかし、彼は最後の最後まで何人の人が選択に現れるかわかりません。あなたの仕事は、クリンガーが提供するデッキと、選択プロセスが始まる直前にカウントする列の人数を使用するプログラムを作成し、列のどの位置に入るのかを伝えて、旅行を保証することです。家。クリンガーのデッキは、20枚目のカードが使用されるまでに仕事を終わらせることが保証されています。

10人、2つのラッキースポット、およびカード3、5、4、3、2の数字を使用した簡単な例は、クリンガーが家に帰るには1位または8位に入る必要があることを示しています。
入力

選択ごとに、22個の整数の行が表示されます。最初の整数(1 <= N <= 50)は、宝くじに参加する人数を示します。2番目の整数(1 <= X <= N)は、ラッキーな「ホーム」位置がいくつ選択されるかです。次の20の整数は、デッキの最初の20枚のカードの値です。カードの値は、1から11までの整数値に解釈されます。
出力

入力行ごとにSelection #A" on a line by itself where A is the number of the selection starting with 1 at the top of the input file. The next line will contain a list of、クリンガーが入り込もうとするメッセージの「ラッキー」位置を印刷します。「ラッキー」位置のリストの後には空白行が続きます。
サンプル入力

10 2 3 5 4 3 2 9 6 10 10 6 2 6 7 3 4 7 4 5 3 2
47 6 11 2 7 3 4 8 5 10 7 8 3 7 4 2 3 9 10 2 5 3

サンプル出力

Selection #1 
1 8 

Selection #2 
1 3 16 23 31 47

C ++(キュー)

#include <iostream>
#include <queue>
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
    
    
	int n,m,id=1;
	while(cin>>n>>m){
    
    
		int p[25];
		for(int i=0;i<20;i++){
    
    
			cin>>p[i]; //卡片 
		}
		
		queue<int> qu1;
		queue<int> qu2;
		for(int i=1;i<=n;i++){
    
    
			qu1.push(i);
		}
		cout<<"Selection #"<<id++<<endl;
		int count = 0; //计数 
		int b = 1;
		int index = 0; //卡片下标
		while(true){
    
     
			count = 0;
			int len = p[index++];
			if(b){
    
     //qu1 
				while(!qu1.empty()){
    
    
					int temp = qu1.front();
					qu1.pop();
					count++;
					if(count==len){
    
    
						count = 0;
					}else{
    
    
						qu2.push(temp);
					}
					if(qu1.size()+qu2.size()==m){
    
    
						while(!qu1.empty()){
    
    
							qu2.push(qu1.front());
							qu1.pop();
						}
						break;
					}
				}
				b = 0;
			}else{
    
     //qu2
				while(!qu2.empty()){
    
    
					int temp = qu2.front();
					qu2.pop();
					count++;
					if(count==len){
    
    
						count = 0;
					}else{
    
    
						qu1.push(temp);
					}
					if(qu1.size()+qu2.size()==m){
    
    
						while(!qu2.empty()){
    
    
							qu1.push(qu2.front());
							qu2.pop();
						}
						break;
					}
				}
				b = 1;
			}
			if(qu1.size()==m){
    
    
				cout<<qu1.front();
				qu1.pop();
				while(!qu1.empty()){
    
    
					cout<<" "<<qu1.front();
					qu1.pop();
				}
				cout<<endl;
				break;
			}
			if(qu2.size()==m){
    
    
				cout<<qu2.front();
				qu2.pop();
				while(!qu2.empty()){
    
    
					cout<<" "<<qu2.front();
					qu2.pop();
				}
				cout<<endl;
				break;
			}
		}
		cout<<endl;
	}
	return 0;
}

C ++(ベクトル)

#include <iostream>
#include <vector>
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
    
    
	int n,m,id = 1;
	while(cin>>n>>m){
    
    
		int p[20];
		for(int i=0;i<20;i++){
    
    
			cin>>p[i];
		}
		vector<int> v;
		for(int i=1;i<=n;i++){
    
    
			v.push_back(i);
		}
		cout<<"Selection #"<<id++<<endl;
		for(int i=0;i<20;i++){
    
    
			int index = p[i]-1;
			while(v.size()>index){
    
    
				if(v.size()==m){
    
    
					break;
				}
				v.erase(v.begin()+index);
				index += p[i]-1;
			}
			if(v.size()==m){
    
    
				cout<<v[0];
				for(int i=1;i<v.size();i++){
    
    
					cout<<" "<<v[i];
				}
				cout<<endl<<endl;
				break;
			}
		}
	} 
	return 0;
}

おすすめ

転載: blog.csdn.net/qq_45880043/article/details/109372187