CCF-CSP 201703-2 Alineación de estudiantes

Descripción del problema
  El maestro de deportes Xiao Ming quiere alinear a los estudiantes en su clase en orden. Primero les pidió a los estudiantes que se alinearan en orden de número de estudiante de pequeño a grande, con el número de estudiante primero en la fila, y luego hizo múltiples ajustes. Ajustar Xiaoming una vez puede permitir que un compañero de clase abandone el equipo, avance o retroceda una cierta distancia antes de insertarse en la cola.
  Por ejemplo, lo siguiente da un ejemplo de un grupo de movimientos, en el que el número de estudiantes es 8.
  0) Los números de los estudiantes en la cola inicial son 1, 2, 3, 4, 5, 6, 7, 8;
  1) Para el primer ajuste, el comando es "El estudiante 3 retrocede 2", lo que indica que el estudiante 3 Equipo, mueva la distancia de 2 compañeros de clase hacia atrás y luego insértelo en la cola, los números de los estudiantes en la nueva cola son 1, 2, 4, 5, 3, 6, 7, 8;
  2) El segundo ajuste, el comando es "El estudiante No. 8 avanza 3" significa que el estudiante No. 8 abandona el equipo, mueve la distancia de 3 estudiantes hacia adelante y luego se inserta en la cola. Los números de estudiantes de los nuevos estudiantes en la cola son 1, 2, 4, 5, 8, 3, 6, 7;
  3) El tercer ajuste, el comando es "El estudiante 3 avanza 2", lo que significa que el estudiante n. ° 3 abandona el equipo, avanza la distancia de 2 estudiantes y luego se inserta en la cola Los números de los alumnos son 1, 2, 4, 3, 5, 8, 6, 7.
  Xiao Ming registró todo el proceso de ajuste. ¿Puedo preguntar, cuáles son los números de estudiantes de todos los estudiantes de adelante hacia atrás?
  Preste especial atención a que los números involucrados en el movimiento anterior se refieren al número del estudiante, no a la posición en el equipo. Cuando se mueve hacia atrás, la distancia de movimiento no debe exceder el número de personas detrás del compañero de clase correspondiente.Si la distancia de movimiento es exactamente igual al número de personas detrás del compañero de clase correspondiente, el compañero de clase se moverá al final de la cola. Al avanzar, la distancia de movimiento no debe exceder el número de personas frente al compañero de clase correspondiente.Si la distancia de movimiento es exactamente igual al número de personas frente al compañero de clase correspondiente, el compañero de clase se moverá al frente de la cola.
Formato de entrada
  La primera línea de la entrada contiene un número entero n, que representa el número de estudiantes, y el número de estudiante está numerado del 1 al n.
  La segunda línea contiene un número entero m, que indica el número de ajustes.
  En las siguientes m líneas, hay dos enteros p, q en cada línea. Si q es positivo, significa que el estudiante con el número de estudiante p se mueve hacia atrás q, si q es negativo, significa que el estudiante con el número de estudiante p se mueve hacia adelante -q.
Formato de
  salida Emite una línea, que contiene n enteros, y dos enteros adyacentes están separados por un espacio para indicar los números de todos los estudiantes de adelante hacia atrás.
Entrada de muestra
8
3
3 2
8-3
3-2
Salida de muestra
1 2 4 3 5 8 6 7
Tamaño de caso de uso de evaluación y convenciones
  Para todos los casos de uso de evaluación, 1 ≤ n ≤ 1000, 1 ≤ m ≤ 1000, todos los movimientos son legales .

Ideas para resolver problemas:
use un vector para almacenar estudiantes con números 1-n, y luego use los métodos de inserción y borrado en el vector para resolver este problema.
Resumen de la experiencia:
preste atención a avanzar y retroceder, el método de inserción es diferente.
Del mismo modo, el método para eliminar los datos originales es diferente después de que se completa el movimiento hacia adelante y se completa el movimiento hacia atrás.
Nota: Durante la prueba, puede imprimir la situación de clasificación actual después de cada movimiento, para que pueda ver claramente el proceso y si es coherente con la descripción del título.

Código C ++:

#include<bits/stdc++.h>
using namespace std;
int main() {
	int n,m;
	scanf("%d %d",&n,&m);
	vector<int> v;
	for(int i=1;i<=n;i++){
		v.push_back(i);
	}
	while(m--){
		int p,q;
		scanf("%d %d",&p,&q);
		for(int i=0;i<n;i++){
			if(p == v[i]){
				if(q>0){ //往后移动
					v.insert(v.begin()+i+1+q,v[i]);
					v.erase(v.begin()+i);
				}else{ //往前移动
					v.insert(v.begin()+i+q,v[i]);
					v.erase(v.begin()+i+1);
				}
				break; //记得移动完毕要break退出,不然遇到往后移的,会重复往后移,之后越界
			}
		}
	}
	for(auto i:v){
		printf("%d ",i);
	}
	return 0;
}
Publicados 111 artículos originales · ganado elogios 2 · Vistas 3533

Supongo que te gusta

Origin blog.csdn.net/m0_38088647/article/details/100712725
Recomendado
Clasificación