El ACM-ICPC 2017 Asia Pekín regional E - gatos y peces

Pensando preguntas, proceso de simulación peces gato salió ~ ~ ~ ~

Hay muchos gatos sin hogar en el campus PKU. Todos ellos están contentos porque los estudiantes en el club de gato de la FCU, tenga mucho cuidado de ellos. Li Lei es uno de los miembros del club de gato. Él ama a los gatos mucho. La semana pasada, ganó una beca y que quería compartir su placer con los gatos. Así que compró un poco de pescado muy sabroso para alimentarlos, y los miraba comer con gran placer. Al mismo tiempo, se encontró con una pregunta interesante:

Hay m peces y gatos n, y se tarda minutos ci para el gato ITH para comer fuera un pez. Un gato comienza a comer otro pescado (si puede conseguir uno) inmediatamente después de que tenga un pez acabado. Un gato nunca comparte sus peces con otros gatos. Cuando hay izquierda no suficiente pescado, el gato que come más rápido tiene mayor prioridad para conseguir un pez que el gato que se come más lento. Todos los gatos comienzan a comer al mismo tiempo. Li Lei quería saber, después de x minutos, cuántos peces se quedaría.

De entrada
ya no hay más de 20 casos de prueba.

Para cada caso de prueba:

La primera línea contiene 3 enteros: por encima de m mencionados, n y x (0 <m <= 5,000, 1 <= n <= 100, 0 <= x <= 1,000).

La segunda línea contiene n enteros c1, c2 ... cn, medios ci que toma los minutos ITH gato ci comer fuera un pescado (1 <= ci <= 2,000).

Salida
Para cada caso de prueba, imprimir 2 números enteros p y q, significando que hay p peces completa (pescado entero) y q peces incompleta izquierda después de x minutos.

Ejemplo de entrada
2 1 1
1
8 3 5
1 3 4
4 5 1
5 4 3 2 1
Salida de muestra
1 0
0 1
0 3

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
	int m, n, x;
	while (scanf("%d%d%d", &m, &n, &x) != EOF){
		int time[110] = { 0 };//每只猫吃一条鱼花费的时间
		for (int i = 0; i < n; i++){cin >> time[i];}
		sort(time, time + n);//因为按照吃鱼所花费的时间优先级分配鱼,所以要排序
		int ti = 0,li=m;//ti表示时间,li表示还剩的鱼个数
		int left[110] = { 0 };//每个时刻每只猫需要吃完一条鱼的剩余时间
		if (m < n){ n = m; }//如果鱼的个数小于猫的个数,则每只猫不会都有鱼吃
		for (int i = 0; i < n; i++){ left[i] = time[i];}//0时刻每只猫吃一条鱼的时间
		li -= n;//假设刚开始每只猫都有一条鱼吃
		while (ti < x+1){
			for (int i = 0; i < n; i++){//每过一分钟后,每只猫,吃一条鱼的时间
				left[i]--;
			}
			ti++;
			if (ti < x){//第i分钟时,一只猫是否可以重新得到一条鱼
				for (int i = 0; i < n; i++)
				if (left[i] <= 0){//一只猫吃完了一条鱼
					if (li > 0){//还有多余的鱼,可以分配给这只已经吃完鱼的猫
						left[i] = time[i];
						li--;
					}
				}
			}
		}

		//统计数组中大于0的个数就是剩余的不完整鱼的个数
		int q = 0;
		for (int i = 0; i < n; i++){
			if (left[i] >= 0){
				q++;
			}
		}

		//li就是剩余的完整鱼的个数
		if (li < 0){ li = 0; }
		cout << li << " " << q << endl;
	}
	return 0;
}
Publicado 87 artículos originales · ganado elogios 73 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/HL_HLHL/article/details/84308877
Recomendado
Clasificación