P8685 [藍橋杯 2019 省 A] 外賣店優先順序

Gold_stein發表於2024-03-19

這道題雖然難度很低,但是細節不少

1.要先處理減,再處理加。因為是先經歷了空檔期的優先順序衰減,然後才有訂單帶來的優先順序提升;先減後加的時候有0這個下限兜底,如果先加後減可能會導致答案偏小。

2.減之後和加之後都要check一下,如果in_cache為true,減完之後小於等於三,但是加了以後又上升到了4,這時候應該就不算優先店鋪了,但是如果少了減之後的那次check,就會導致這個本該被去掉的店仍然是優先店鋪。

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string>
#include <vector>
#include <cmath>
#define For(i, j, n) for(int i = j ; i <= n ; ++i)
using namespace std;

const int N = 1e5 + 5;

inline int read()
{
    int x = 0; char ch=getchar();
    while(ch<'0'||ch>'9')
        ch = getchar();
    while(ch>='0'&&ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x;
}

int n, m, t, cnt;
vector<int> _orders[N];

void check(bool &f, int l)
{
    if(!f && l > 5)
        f = true;
    if(f && l <= 3)
        f = false;
}

void calculate_priority(vector<int> &tar, int id)
{
    int last_time = 0, _level = 0;
    bool in_cache = false;
    for(int _time:tar)
    {
        _level = max(0, _level - max(0, _time - last_time - 1));
        check(in_cache, _level);
        _level += 2;
        check(in_cache, _level);
        last_time = _time;
    }
    _level = max(0, _level - (t - last_time));
    check(in_cache, _level);
    if(in_cache)
        cnt++;
}

int main()
{
    n=read();m=read();t=read();
    For(i,1,m)
    {
        int ts = read(), id = read();
        _orders[id].push_back(ts);
    }
    For(i,1,n)
    {
        if(!_orders[i].empty())
        {
            sort(_orders[i].begin(), _orders[i].end());
            calculate_priority(_orders[i], i);
        }
    }
    printf("%d\n", cnt);
    return 0;
}

要嚴謹。

相關文章