第十届蓝桥杯:外卖店优先级

题目链接:https://nanti.jisuanke.com/t/45592

题目描述:

饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有一个优先级,初始时 (0 时刻) 优先级都为 0。

每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。

如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果优先级小于等于 3,则会被清除出优先缓存。

给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优先缓存中。

【输入格式】

第一行包含 3 个整数 N、M 和 T。

以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到一个订单。

【输出格式】

输出一个整数代表答案。

【评测用例规模与约定】

对于 80% 的评测用例,1 ≤ N, M, T ≤ 10000。

对于所有评测用例,1 ≤ N, M, T ≤ 100000,1 ≤ ts ≤ T,1 ≤ id ≤ N。

思路:

直接遍历会超时,
需要先对输入的数据按时间排序,然后根据时间逐个判断。注意细节!!

AC代码:

#include
#include
#include

using namespace std;
const int maxn=100005;

struct node
{
     
	int time;
	int last;
	bool isin;
	node():time(0),last(0),isin(false){
     
	}
}a[maxn];

struct data
{
     
	int ts;
	int id;
}b[maxn];

bool cmp(data x,data y)
{
     
	if(x.ts!=y.ts)
			return x.ts<y.ts;
		else 
			return x.id<y.id;
}

int main()
{
     
	int n,m,t;
	int i,j;
	int id,ts;
	int ans=0;
	scanf("%d%d%d",&n,&m,&t);
	for(i=0;i<m;++i)
	{
     
		scanf("%d%d",&b[i].ts,&b[i].id);
	}
	sort(b,b+m,cmp);
	for(i=0;i<m;++i)
	{
     
		id=b[i].id;
		ts=b[i].ts;
		if(ts-a[id].last>1&&a[id].time!=0)
			a[id].time=a[id].time>ts-a[id].last-1?a[id].time-(ts-a[id].last-1):0;
		if(a[id].time<=3)
			a[id].isin=false; //减掉以后先判断是否被移出,之后再加2
		a[id].time+=2;   //注意这个细节!!
		if(a[id].time>5)
			a[id].isin=true;
		a[id].last=ts;
	}
	for(i=1;i<=n;++i)
	{
     
		if(t!=a[i].last&&a[i].time!=0)
			a[i].time=a[i].time>t-a[i].last?a[i].time-(t-a[i].last):0;
		if(a[i].time<=3)
			a[i].isin=false;
		if(a[i].isin)
			ans++;
	}
	cout<<ans<<endl;
	return 0;
}

你可能感兴趣的:(思维,蓝桥杯)