题目链接
1241. 外卖店优先级
“饱了么”外卖系统中维护着 \(N\) 家外卖店,编号 \(1∼N\)。
每家外卖店都有一个优先级,初始时 (\(0\) 时刻) 优先级都为 \(0\)。
每经过 \(1\) 个时间单位,如果外卖店没有订单,则优先级会减少 \(1\),最低减到 \(0\);而如果外卖店有订单,则优先级不减反加,每有一单优先级加 \(2\)。
如果某家外卖店某时刻优先级大于 \(5\),则会被系统加入优先缓存中;如果优先级小于等于 \(3\),则会被清除出优先缓存。
给定 \(T\) 时刻以内的 \(M\) 条订单信息,请你计算 \(T\) 时刻时有多少外卖店在优先缓存中。
输入格式
第一行包含 \(3\) 个整数 \(N,M,T\)。
以下 \(M\) 行每行包含两个整数 \(ts\) 和 \(id\),表示 \(ts\) 时刻编号 \(id\) 的外卖店收到一个订单。
输出格式
输出一个整数代表答案。
数据范围
\(1≤N,M,T≤10^5,\)
\(1≤ts≤T,\)
\(1≤id≤N\)
输入样例:
2 6 6
1 1
5 2
3 1
6 2
2 1
6 2
输出样例:
1
样例解释
\(6\) 时刻时,\(1\) 号店优先级降到 \(3\),被移除出优先缓存;\(2\) 号店优先级升到 \(6\),加入优先缓存。
所以是有 \(1\) 家店 (\(2\) 号) 在优先缓存中。
解题思路
模拟
由于每家店之间互不影响,所以可以把每家店分开,按时间排序,按时间模拟一遍
- 时间复杂度:\(O(nlogn)\)
代码
// Problem: 外卖店优先级
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/1243/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
// %%%Skyqwq
#include <bits/stdc++.h>
//#define int long long
#define help {cin.tie(NULL); cout.tie(NULL);}
#define pb push_back
#define fi first
#define se second
#define mkp make_pair
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
template <typename T> bool chkMax(T &x, T y) { return (y > x) ? x = y, 1 : 0; }
template <typename T> bool chkMin(T &x, T y) { return (y < x) ? x = y, 1 : 0; }
template <typename T> void inline read(T &x) {
int f = 1; x = 0; char s = getchar();
while (s < '0' || s > '9') { if (s == '-') f = -1; s = getchar(); }
while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();
x *= f;
}
const int N=1e5+5;
int n,m,t;
unordered_map<int,vector<int>> mp;
int main()
{
cin>>n>>m>>t;
for(int i=1;i<=m;i++)
{
int ts,id;
cin>>ts>>id;
mp[id].pb(ts);
}
int res=0;
for(auto T:mp)
{
int id=T.fi;
auto tss=T.se;
sort(tss.begin(),tss.end());
int priority=0;
bool f=false;
for(int i=0;i<tss.size();i++)
{
if(!i)priority+=2;
else
{
if(tss[i]-tss[i-1]!=0)
priority=max(0,priority-(tss[i]-tss[i-1])+1);
if(priority<=3)f=false;
priority+=2;
}
if(priority>5)f=true;
}
priority-=t-tss.back();
if(priority<=3)f=false;
res+=f;
}
cout<<res;
return 0;
}