(Segundo Juego Provincial del 12° Puente Azul) Balanceo de Carga (Cola Prioritaria + Pensamiento)

Análisis: esta pregunta examina la cola de prioridad. Podemos almacenar datos de tipo par en la cola de prioridad. La primera dimensión del par es el tiempo de finalización de la tarea, y la segunda dimensión es la potencia informática ocupada por la tarea. Dado que el tipo de par se ordena de acuerdo con la primera dimensión y se ordena de acuerdo con el tiempo de finalización de temprano a tarde, no necesitamos ordenar por estructura escrita a mano, podemos usar directamente mayor.

Permítanme hablar sobre cómo lidiar con este problema. Primero creamos una matriz p, p[i] registra la potencia de cálculo actual de la i-ésima computadora . Si actualmente pasamos a una tarea, esta tarea se asignará a la t - th computadora Para las computadoras, primero recorremos la cola de prioridad de la t-ésima computadora, liberamos todas las tareas en la cola de prioridad cuya hora de terminación es anterior a la hora actual, y agregamos la potencia de cómputo ocupada por la tarea en el proceso de liberación la tarea Cuando finaliza la cola de prioridad Después de que se liberan todas las tareas con un tiempo menor o igual que el tiempo actual, en este momento p[t] realmente representa la potencia informática de la computadora t-ésima. En este momento, la relación entre Se juzga p[t] y d. Si p[t]<d, entonces salida directa -1, si p[t]>=d, salida p[t]-d, suma p[t]-d, y suma la tarea a la cola de prioridad de la t-ésima computadora, la finalización de la tarea El tiempo es a+c-1 y la potencia de cómputo es d .

Aquí está el código:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>PII;
const int N=200030;
priority_queue<PII,vector<PII>,greater<PII> >q[N];
ll p[N];//p[i]表示第i个计算机的算力
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		scanf("%lld",&p[i]); 
	for(int i=1;i<=m;i++)
	{
		ll a,b,c,d;
		scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
		while(!q[b].empty()&&q[b].top().first<a)
		{
			p[b]+=q[b].top().second;//把无效任务的占用的算力释放 
			q[b].pop();//释放无效任务 
		}
		if(p[b]>=d)
		{
			p[b]-=d;
			printf("%lld\n",p[b]);
			q[b].push({a+c-1,d});//把当前任务加入第b个计算机的优先队列 
		}
		else
			puts("-1");
	}	
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/AC__dream/article/details/124049001
Recomendado
Clasificación