Estadísticas de SSL 1063

Estadísticas de SSL 1063

En cierta investigación científica, se obtuvieron n números naturales, y cada número no superó los 1500000000 (1,5 * 109). Se sabe que no hay más de 10.000 números distintos. Ahora es necesario contar el número de apariciones de estos números naturales y generar los resultados estadísticos en orden de números naturales de pequeño a grande.

Entrada

La entrada contiene n + 1 líneas; la primera línea es un número entero n, que representa el número de números naturales; cada línea del 2 al n + 1 tiene un número natural.

Salida

La salida contiene m filas (m es el número de números diferentes entre los n números naturales), que se emiten en orden descendente de números naturales. Cada línea genera dos números enteros, que son el número natural y el número de apariciones del número, separados por un espacio.

Entrada de muestra

8 2 4 2 4 5100
2100 Salida de muestra

2 3
4 2
5
1100 2
40% de los datos cumple: 1 <= n <= 1000
80% de los datos cumple: 1 <= n <= 50000

El 100% de los datos cumple: 1 <= n <= 200000, cada número no supera los 1500 000 000 (1,5 * 109)

No hay mucho que decir, publique el código primero

#include<iostream>
#include<cstdio>
#include<algorithm>
#define p 4000037
#define maxx 5000000
using namespace std;
int n,h[maxx][2],c[maxx];
int hash(int x){												/*哈希取余函数 */
	return x%p;
}
int dw(int x){													/*定位函数,返回x在哈希表中的位置*/ 
	int n=hash(x),i=0;
	while(i<maxx and h[(i+n)%p][0]!=0 and h[(i+n)%p][0]!=x){	/*i代表下标应该后移几位*/ 
		i++;
	}
	return (i+n)%p;
}
void in(int x){													/*不同于普通的插入函数,此题还要记录每个数出现了几次 */
	h[dw(x)][0]=x;
	h[dw(x)][1]++;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&c[i]);		
	}
	sort(c+1,c+n+1);											/*天下偷懒我第一!sort排序函数,排序c数组*/ 
	for(int i=1;i<=n;i++){
		in(c[i]);
	}
	for(int i=1;i<=n;i++){
		if(c[i]!=c[i-1] or i==1)								/*避免重复输出 */
			printf("%d %d\n",c[i],h[dw(c[i])][1]);
	}
	return 0;
}

Utilizo una tabla hash para esta pregunta, pero hay algunos puntos a tener en cuenta al insertar un hash. Clasifique antes de insertar. Se puede utilizar cualquier método de clasificación. Es mejor utilizar una clasificación rápida u otra clasificación, siempre que no se exceda el tiempo. Pero si alguien es un konjac como yo, simplemente use la función sort directamente, la pereza es lo mejor. El archivo de encabezado de la función de clasificación es un algoritmo, um.
Hash tiene varias funciones principales, la función dw, es ubicar qué número debería estar y dónde. Primero, use la función hash para calcular la ubicación n que debe almacenarse si no hay conflicto, y luego verifique si hay un conflicto. Si hay un conflicto, retroceda, este proceso se completa en while.

	while(i<maxx and h[(i+n)%p][0]!=0 and h[(i+n)%p][0]!=x){	
		i++;

Para decirlo brevemente,
i <maxx es detectar si i excede el tamaño de la matriz. Es fácil de entender
h [(i + n)% p] [0]! = 0 es juzgar si la posición actual está vacía . Coloque el recuento
h [(i + n)% p] [0]! = X Determina si se encuentra el elemento x y deténgase si lo encuentra, porque un tipo de elemento en la tabla hash solo se puede almacenar en el mismo lugar.

A continuación, la función in es una función de inserción, que coloca un número en la tabla hash.

h[dw(x)][0]=x;
h[dw(x)][1]++;

Primero localice el elemento x, y luego coloque x en la posición correspondiente. En el subíndice de segundo nivel, h [i] [0] indica cuál es el número y h [i] [1] indica cuántas veces aparece este número .
La función principal no es nada de lo que hablar. Lo más importante es la sentencia de juicio al emitir. Si el número que se emitirá es el mismo que el anterior, no repita la salida, de lo contrario será incorrecto. Cuando i es 1 , se debe a que es lo mismo que c [0] Repetir, también debería salir, porque c [0] no necesita salir.

Supongo que te gusta

Origin blog.csdn.net/weixin_54799322/article/details/112972862
Recomendado
Clasificación