Priorité à emporter C ++ (simulation)

Il y a N magasins à emporter dans le système de vente à emporter «Est-ce que c'est plein», numéroté 1N.
Chaque magasin à emporter a une priorité, et la priorité est de 0 au début (au temps 0). Après
chaque unité de temps, si le magasin à emporter n'a pas de commande, la priorité sera réduite de 1, et la plus basse sera réduite à 0; si le magasin à emporter a une commande, la priorité ne diminuera pas mais augmentera, et la priorité augmentera de 2 pour chaque commande.
Si la priorité d'un restaurant à emporter est supérieure à 5 à un certain moment, elle sera ajoutée au cache de priorité par le système; si la priorité est inférieure ou égale à 3, elle sera effacée du cache de priorité.
Compte tenu des M informations de commande dans le temps T, veuillez calculer le nombre de magasins à emporter dans le cache prioritaire au moment T.
Format d'entrée La
première ligne contient 3
entiers N, M, T.
Chaque ligne des M lignes suivantes contient deux entiers ts et id, indiquant que le magasin à emporter avec le numéro id au moment ts a reçu une commande.
Format de
sortie Sortez un entier pour représenter la réponse.
Plage de données
1≤N, M, T≤105,1≤ts≤T, 1≤id≤N
Exemple d'entrée:
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
Exemple de sortie:
1
exemple d'explication
A 6
heures, la priorité du magasin n ° 1 tombe à 3 et est supprimée du cache prioritaire; la priorité du magasin n ° 2 passe à 6 et le cache prioritaire est ajouté. Il y a donc 1 magasin (n ° 2) dans le cache prioritaire.

Cette question peut utiliser le tri pour traiter les commandes du même magasin en même temps afin d'améliorer l'efficacité.

Code 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;
}

Je suppose que tu aimes

Origine blog.csdn.net/qq_44643644/article/details/108891327
conseillé
Classement