Clasificación de matriz de estructura + función de comparación + detalles múltiples 1075 PAT Judge (25 puntos)

1075 PAT Juez (25 分)

La lista de clasificación de PAT se genera a partir de la lista de estado, que muestra los puntajes de las presentaciones. Esta vez se supone que debes generar la lista de clasificación para PAT.

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea contiene 3 enteros positivos, N (≤10
4
), el número total de usuarios, K (≤5), el número total de problemas y M (≤10
5
) , el número total de envíos. Luego se supone que los ID de usuario son números de 5 dígitos desde 00001 a N, y los ID de problema son de 1 a K. La siguiente línea contiene K enteros positivos p [i] (i = 1, ..., K), donde p [i] corresponde a la marca completa del i-ésimo problema. Luego siguen las líneas M, cada una proporciona la información de un envío en el siguiente formato:

user_id problem_id partial_score_obtained

donde partial_score_obtained es −1 si el envío ni siquiera puede pasar el compilador, o es un número entero en el rango [0, p [problem_id]]. Todos los números en una línea están separados por un espacio.

Especificación de salida:
para cada caso de prueba, se supone que debe generar la lista de clasificación en el siguiente formato:

rango user_id total_score s [1]… s [K]

donde el rango se calcula de acuerdo con el puntaje total, y todos los usuarios con el mismo puntaje total obtienen el mismo rango; y s [i] es la puntuación parcial obtenida para el i-ésimo problema. Si un usuario nunca ha enviado una solución para un problema, se debe imprimir "-" en la posición correspondiente. Si un usuario ha enviado varias soluciones para resolver un problema, se contará la puntuación más alta.

La lista de clasificación debe imprimirse en orden no decreciente de los rangos. Para aquellos que tienen el mismo rango, los usuarios deben clasificarse en orden no creciente según el número de problemas perfectamente resueltos. Y si todavía hay un empate, deben imprimirse en orden creciente de sus identificaciones. Para aquellos que nunca han presentado ninguna solución que pueda pasar el compilador, o que nunca hayan enviado ninguna solución, NO deben mostrarse en la lista de clasificación. Se garantiza que al menos un usuario se puede mostrar en la lista de clasificación.

Entrada de muestra:

7 4 20
20 25 25 30
00002 2 12
00007 4 17
00005 1 19
00007 2 25
00005 1 20
00002 2 2
00005 1 15
00001 1 18
00004 3 25
00002 2 25
00005 3 22
00006 4 -1
00001 2 18
00002 1 20
00004 1 15
00002 4 18
00001 3 4
00001 4 2
00005 2 -1
00004 2 0

Salida de muestra:

1 00002 63 20 25 - 18
2 00005 42 20 0 22 -
2 00007 42 - 25 - 17
2 00001 42 18 18 4 2
5 00004 40 15 0 25 -

Resolución de problemas

Analice las condiciones de las preguntas una por una:
1. Método de clasificación: el puntaje
total se ordena de mayor a menor ;
si el puntaje total es el mismo, el número de preguntas de puntaje completo se ordena de más a menos ;
si el puntaje completo es el mismo, el orden es de pequeño a grande;

Construya la función de estructura de acuerdo con los requisitos anteriores; la
suma total de puntaje, el problema de puntaje de la pregunta, el ID del estudiante, el número de preguntas de puntaje completo, para determinar si hay indicadores enviados que se han compilado y aprobado; (Las preguntas requieren que ninguna de las preguntas se haya enviado o enviado pero nadie haya aprobado Los compañeros de clase compilados no salen).

struct User{
	int Sum=0;
	int Problem[6];
	int Id;
	int Passnum=0;
	int flag=0;
	
}users[MAXN];

Función de comparación: si el
puntaje total es diferente, el puntaje es más alto; si el puntaje total es el mismo, el número de preguntas no tiene éxito, entonces más es el primero; si el puntaje total es el mismo, el número de estudiantes es menor;

bool compare (User a,User b)
{
	if(a.Sum!=b.Sum) return a.Sum>b.Sum;
	else 
	{
		if(a.Passnum!=b.Passnum) return a.Passnum>b.Passnum;
		else return a.Id<b.Id;
	}
}

2. Función de entrada Ingrese
según sea necesario.
Nota : Debido a que habrá envíos repetidos, el puntaje total no se calculará hasta que se complete toda la entrada;
si el puntaje de envío es mayor que el puntaje original e igual que el puntaje completo, el número de puntajes completos es +1;
si el puntaje de envío no es -1, el usuario se marca como no utilizado Saltar

int N,K,M;
int p[6];

void input()
{	
	cin>>N>>K>>M;    //输入人数,题目数,总提交数
	for(int i=1;i<=K;i++)
		cin>>p[i];     //每一题的总分 
	
	for(int i=1;i<=N;i++)
	fill(users[i].Problem,users[i].Problem+6,-2);	
	
	
	int a,b;
	int grade;
	for(int i=0;i<M;i++)
	{	
		cin>>a>>b>>grade;
		users[a].Id=a;
		
		if(grade!=-1) users[a].flag=1;
		
		if(grade>users[a].Problem[b])
			{
			users[a].Problem[b]=grade;
			
			if(users[a].Problem[b]==p[b])
				++users[a].Passnum;
			}
	}
	//输入完毕;计算sum
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=K;j++)
			if(users[i].Problem[j]>0) users[i].Sum+=users[i].Problem[j];
	 } 
	
}

El código completo es
simple, preste atención a los detalles;

#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 10010

struct User{
	int Sum=0;
	int Problem[6];
	int Id;
	int Passnum=0;
	int flag=0;
	
}users[MAXN];

int N,K,M;
int p[6];

void input()
{	
	cin>>N>>K>>M;    //输入人数,题目数,总提交数
	for(int i=1;i<=K;i++)
		cin>>p[i];     //每一题的总分 
	
	for(int i=1;i<=N;i++)
	fill(users[i].Problem,users[i].Problem+6,-2);	
	
	int a,b;
	int grade;
	for(int i=0;i<M;i++)
	{	
		cin>>a>>b>>grade;
		users[a].Id=a;
		
		if(grade!=-1) users[a].flag=1;
		
		if(users[a].Problem[b]==0)
		{
		users[a].Problem[b]=grade;	
			
		if(users[a].Problem[b]==p[b])
			++users[a].Passnum;
		}
		
		else if(grade>users[a].Problem[b])
			{
			users[a].Problem[b]=grade;

			if(users[a].Problem[b]==p[b])
				++users[a].Passnum;
			}
	}
	//输入完毕;计算sum
	for(int i=1;i<=N;i++)
	{
		for(int j=1;j<=K;j++)
			if(users[i].Problem[j]>0) users[i].Sum+=users[i].Problem[j];
	 } 
	
}
//存放完毕
//p里面时题目总分;
//user里面是人id,题目id,题目分数 

bool compare (User a,User b)
{
	if(a.Sum!=b.Sum) return a.Sum>b.Sum;
	else 
	{
		if(a.Passnum!=b.Passnum) return a.Passnum>b.Passnum;
		else return a.Id<b.Id;
	}
}

void ASort()
{
	sort(users+1,users+N+1,compare);
}

void output()
{
	int temp=0;
	int index=0;
	int tempindex=0;
	/*5、最后一个输出,一道题都没有提交或者提交但没有一道题通过编译的同学不输出。
	(一定要注意,提交没有通过编译和提交得零分完全是两个概念,
	所以在这里输出的时候一定要注意,后者是需要输出的)*/
	for(int i=1;i<=N;i++)
	{
		if(users[i].flag==0) continue;
		
		++tempindex;
		if(users[i].Sum!=temp)
		{
			index=tempindex;
			temp=users[i].Sum;
		}
		
		printf("%d %05d %d",index,users[i].Id,users[i].Sum);
		for(int j=1;j<=K;j++)
			if (users[i].Problem[j]>=0) printf(" %d",users[i].Problem[j]);
			else if(users[i].Problem[j]==-1) printf(" 0");
			else if(users[i].Problem[j]==-2) printf(" -");
		cout<<endl;
	}
}

int main()
{
	input();
	ASort();
	output();
}


Publicados 105 artículos originales · ganado elogios 6 · vistas 4940

Supongo que te gusta

Origin blog.csdn.net/BLUEsang/article/details/105598974
Recomendado
Clasificación