外卖店优先级
试题 G: 外卖店优先级
时间限制: 1.0s 内存限制: 512.0MB 本题总分: 20 分
【问题描述】
“饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N。每家外卖店都有
一个优先级,初始时 (0 时刻) 优先级都为 0。
每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 1,最低减
到 0;而如果外卖店有订单,则优先级不减反加,每有一单优先级加 2。
如果某家外卖店某时刻优先级大于 5,则会被系统加入优先缓存中;如果
优先级小于等于 3,则会被清除出优先缓存。
给定 T 时刻以内的 M 条订单信息,请你计算 T 时刻时有多少外卖店在优
先缓存中。
【输入格式】
第一行包含 3 个整数 N、 M 和 T。
以下 M 行每行包含两个整数 ts 和 id,表示 ts 时刻编号 id 的外卖店收到
一个订单。
【输出格式】
输出一个整数代表答案。
【样例输入】
2 6 6//N店数 M订单条数 T时刻
1 1// 时刻 编号
5 2
3 1
6 2
2 1
6 2
【样例输出】
1
【样例解释】
6 时刻时, 1 号店优先级降到 3,被移除出优先缓存; 2 号店优先级升到 6,
加入优先缓存。所以是有 1 家店 (2 号) 在优先缓存中。
【评测用例规模与约定】
对于 80% 的评测用例, 1 ≤ N; M; T ≤ 10000。
对于所有评测用例, 1 ≤ N; M; T ≤ 100000, 1 ≤ ts ≤ T, 1 ≤ id ≤ N。
分析
这个题的话,是直接看结果而不用看过程,所以,我们可以先将订单数输入并且增加优先级,最终将优先级进行比较即可。
上面是我最初的分析,当然,是错的了,只看结果,是个大坑;
现在重新分析,由于进入优先要大于5,而退出优先,要小于3,很明显没有办法去看结果,因为如果结果是4,他可能是没进入过,也可能是进入之后减到4,所以我的思路是按一个时刻一个时刻的遍历。
#include "stdafx.h"
#include<iostream>
using namespace std;
const int N=100020;
int a[N];//标记优先级
int b[6*N]={0};//每6个一组;标记每个时间段每个订单条数
int c[N]={0};//标记是否在优先缓存中
int _tmain(int argc, _TCHAR* argv[])
{
int m,n,t;
cin>>n>>m>>t;
int ans=0;
for(int i=0;i<m;i++)
{
int ts,id;
cin>>ts>>id;
b[6*id+ts];//将订单信息输入b数组中;
}
for(int i=0;i<=n;i++)
{
for(int j=1;j<=6;j++)
if(b[i*6+j]==0)//id为i的数组j时刻没有订单
{
if(a[i]!=0)//优先级不为0的话就自减;
a[i]--;
}
else
{
a[i]=b[i*6+j]*2;//a[i]为订单数乘2,这里a[i]储存的是每个时刻的优先级
if(a[i]>5)
c[i]=1;//某时刻优先级大于5,进入优先缓存;
else if(a[i]<=3&&c[i]==1)//小于3,退出优先缓存;
c[i]=0;
}
}
for(int i=0;i<=n;i++)
if(c[i]==1)
ans++;//将现在在优先级中的数目算上输出就是结果;
cout<<ans;
return 0;
}