Prioridad para llevar de C ++ (simulación)

Hay N tiendas de comida para llevar mantenidas en el sistema de comida para llevar "¿Está lleno?", Numeradas 1∼N.
Cada tienda de comida para llevar tiene una prioridad, y la prioridad es 0 al principio (en el momento 0). Después de
cada unidad de tiempo, si la tienda de comida para llevar no tiene pedido, la prioridad se reducirá en 1, y la más baja se reducirá a 0; si la tienda de comida para llevar tiene un pedido, la prioridad no disminuirá sino que aumentará, y la prioridad aumentará en 2 para cada pedido.
Si la prioridad de un restaurante de comida para llevar es mayor que 5 en un momento determinado, el sistema lo agregará a la caché de prioridad; si la prioridad es menor o igual a 3, se borrará de la caché de prioridad.
Dadas las M piezas de información del pedido en el tiempo T, calcule cuántas tiendas de comida para llevar hay en la caché de prioridad en el tiempo T.
Formato de entrada La
primera línea contiene 3
números enteros N, M, T.
Cada línea de las siguientes M líneas contiene dos números enteros ts e id, lo que indica que la tienda de comida para llevar con el número id en el momento ts recibió un pedido.
Formato de
salida Genera un número entero para representar la respuesta.
Rango de datos
1≤N, M, T≤105,1≤ts≤T, 1≤id≤N
Ejemplo de entrada:
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
Ejemplo de salida:
1
ejemplo de explicación
A las 6 en
punto, la prioridad de la tienda n. ° 1 cae a 3 y se elimina del caché de prioridad; la prioridad de la tienda n. ° 2 aumenta a 6 y se agrega la caché de prioridad. Entonces hay 1 tienda (No. 2) en la caché de prioridad.

Esta pregunta puede usar la clasificación para procesar pedidos de la misma tienda al mismo tiempo para mejorar la eficiencia.

Código AC:

#include<stdio.h>
#include<algorithm>

using namespace std;

const int N=100010;

int last[N];//上次接到订单的时候
pair<int,int> order[N];//订单
int score[N];//优先级
bool exist[N];//是否在缓存中

int main()
{
    
    
    int n,m,T;
    scanf("%d%d%d",&n,&m,&T);
    for(int i=0;i<m;++i)
        scanf("%d%d",&order[i].first,&order[i].second);
    //STL默认用升序排列,时刻早、店序号的排前面
    sort(order,order+m);
    
    for(int i=0;i<m;)
    {
    
    
        //寻找同时刻同家店的订单
        int j=i;
        while(j<m&&order[j]==order[i]) ++j;
        //获得该时刻和该店序号,计算订单数
        int t=order[i].first,id=order[i].second,cnt=j-i;
        //j刚好指向第一个不是同时刻同家店的订单
        i=j;
		
		//处理t时刻前的消息
        score[id]-=t-last[id]-1;//计算没接到订单的时间,修改优先级
        if(score[id]<0) score[id]=0;
        if(score[id]<=3) exist[id]=false;
		
		//处理t时刻消息
        score[id]+=2*cnt;//接到订单,优先级增加
        if(score[id]>5) exist[id]=true;
        last[id]=t;//修改最后一次接到订单的时刻
    }

    for(int i=1;i<=n;++i)//处理T时刻的信息
    {
    
    
        if(last[i]<T){
    
    
            score[i]-=T-last[i];
            if(score[i]<=3) exist[i]=false;
        }
    }

    int ans=0;//统计答案
    for(int i=1;i<=n;++i)
        if(exist[i]) ++ans;
    printf("%d",ans);

    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_44643644/article/details/108891327
Recomendado
Clasificación