poj1591 (problema del anillo de Joseph)

M A S * H

Límite de tiempo: 1000MS Límite de memoria: 10000K
Total de envíos: 1264 Aceptados: 667
Descripción

El cabo Klinger es miembro del Hospital Quirúrgico Móvil del Ejército 4077 en la Guerra de Corea; y hará cualquier cosa para salir. El Ejército de los Estados Unidos ha hecho una oferta por una lotería que elegirá a algunos afortunados (X) para regresar a los estados para una gira de reclutamiento. Klinger necesita tu ayuda para salir.
La lotería se lleva a cabo alineando a todos los miembros de la unidad en atención y eliminando miembros contando los miembros de 1 a N, donde N es un número elegido sacando cartas de la parte superior de una baraja. Cada vez que se alcanza N, esa persona se sale de la línea y el conteo comienza de nuevo en 1 con la siguiente persona en la línea. Cuando se haya llegado al final de la línea (con el número que sea), se tomará la siguiente carta en la parte superior de la baraja y el conteo comenzará de nuevo en 1 con la primera persona en la línea restante. Las últimas X personas de la fila pueden irse a casa.

Klinger ha encontrado una manera de intercambiar un mazo apilado con el mazo real justo antes de que comience el proceso de selección. Sin embargo, no sabrá cuántas personas se presentarán a la selección hasta el último minuto. Su trabajo es escribir un programa que utilice la plataforma que Klinger proporciona y la cantidad de personas en la fila que él cuenta justo antes de que comience el proceso de selección y decirle en qué posición (s) de la fila debe ingresar para asegurarse un viaje. casa. Puede estar seguro de que la baraja de Klinger hará el trabajo cuando se use la carta número 20.

Un ejemplo simple con 10 personas, 2 puntos de suerte y los números de las tarjetas 3, 5, 4, 3, 2 mostraría que Klinger debería estar en las posiciones 1 u 8 para volver a casa.
Entrada

Para cada selección, se le dará una línea de 22 números enteros. El primer número entero (1 <= N <= 50) indica cuántas personas participarán en la lotería. El segundo número entero (1 <= X <= N) es la cantidad de posiciones afortunadas "de inicio" que se seleccionarán. Los siguientes 20 enteros son los valores de las primeras 20 cartas del mazo. Los valores de las cartas se interpretan como valores enteros entre 1 y 11 inclusive.
Salida

Para cada línea de entrada, debe imprimir el mensaje 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"posiciones afortunadas" en las que Klinger debería intentar entrar. La lista de posiciones "afortunadas" va seguida de una línea en blanco.
Entrada de muestra

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

Salida de muestra

Selection #1 
1 8 

Selection #2 
1 3 16 23 31 47

C ++ (cola)

#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 ++ (vector)

#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;
}

Supongo que te gusta

Origin blog.csdn.net/qq_45880043/article/details/109372187
Recomendado
Clasificación