##1458: [蓝桥杯2019初赛]外卖店优先级(c++究极暴力无脑解法)
【问题描述】
饱了么”外卖系统中维护着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
1 1
5 2
3 1
6 2
2 1
6 2
【样例输出】
1
思路:
1.他需要求的是T时刻有多少优先缓存,那么我们只需要每次专门判断其中一家店是否优先缓存。如果符合就res++
2.那么如何判断是否优先缓存呢,在输入的时候,记录每次输入的时刻出现的次数,即单位时间外卖份数。
从时间1一直循环到T:
如果当前外卖份数为0,则优先级-1(注意不能小于0);
如果当前外卖份数不为0,则优先级+=2*外卖数;
最后每一时刻都需要判断是否为优先缓存 【优先级>5 ??? 优先级<=3】
话不多说,上代码:
#include<bits/stdc++.h>
using namespace std;
const int n=100010;
int a[120*n];
//这个数组【120*i+j】代表i店j时刻的外卖数
//这里最好别学我搞这种,建议用结构体或其他方式
int b[n];
//b存优先级
int main()
{
int N,M,T;
cin>>N>>M>>T;
for(int i=1;i<=M;i++)
{
int x,y;
cin>>x>>y;
a[y*120+x]++;//第y家店第x时刻的外卖
}
//每家店都判断一次
int res=0; //最后结果
bool youxian;//当前是否是优先缓存
for(int i=1;i<=N;i++)
{
youxian=false;
for(int j=1;j<=T;j++)
{
if(a[i*120+j])//不为0就加
b[i]+=2*a[i*120+j];
else//否则减
b[i]=max(0,b[i]-1);
//优先判断
if(b[i]<=3)youxian=false;
if(b[i]>5)youxian=true;
}
if(youxian)res++;
}
cout<<res<<endl;
return 0;
}