1241. 外卖店优先级

题目链接

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;
}
posted @ 2022-02-23 12:46  zyy2001  阅读(146)  评论(0编辑  收藏  举报