资源限制
时间限制:1.0s 内存限制:256.0MB
思路:
先按ts升序,然后1-t时刻来搞
具体思路在代码里
#include <stdio.h>
#include <mem.h>
#define NUM 100010
int q[NUM][2];//记录ts和id
int map[NUM];//优先级级数记录
int flag[NUM];//t时刻是否有单的记录
int dd[NUM];//已进入优先级记录
void swap(int q[][2],int i,int j)//交换函数
{
int t=q[i][0];
q[i][0]=q[j][0];
q[j][0]=t;
t=q[i][1];
q[i][1]=q[j][1];
q[j][1]=t;
}
void quickSort(int q[][2],int l,int r)
{
if(l>=r) return ;
int i=l-1,j=r+1;
int x=q[(l+r)>>1][0];
while(i<j)
{
do i++;while(q[i][0]<x);
do j--;while(q[j][0]>x);
if(i<j) swap(q,i,j);
}
quickSort(q,l,j);
quickSort(q,j+1,r);
}
int main() {
int N,M,T;
scanf("%d %d %d",&N,&M,&T);
int j=0,i,k;
for(i=0;i<M;i++)
scanf("%d %d",&q[i][0],&q[i][1]);
//按时间ts即q[i][0]排序
quickSort(q,0,M-1);
//按时间段来
for(i=1;i<=T;i++)
{
//满足时间i,且小于数组大小,j<M;
while(j<M&&q[j][0]==i)
{
//有单加二
map[q[j][1]]+=2;
//记录优先级,因为只有进入这个循环的外卖店的优先级才有可能大于5;
if(map[q[j][1]]>5) dd[q[j][1]]=1;
//标记编号为q[j][1]的外卖店有单
flag[q[j][1]]=1;
j++;
}
//循环所有外卖店一次,看看哪个店没有单
for(k=1;k<=N;k++){
//i时刻没单且优先级大于0,因为优先级最小为0
if(!flag[k]&&map[k]>0) map[k]-=1;
//可能是优先缓存的然后又小于三,所有要移出优先缓存名单
if(map[k]<=3) dd[k]=0;
}
//为下一次个时刻做准备
memset(flag,0,sizeof(flag));
}
int sum=0;
for(k=1;k<=N;k++)
{
//加入了优先级并且大于3
if(dd[k]&&map[k]>3) sum++;
}
printf("%d",sum);
return 0;
}