2019 蓝桥 G.外卖店优先级 菜鸡写法

思路是:
先按照ID排序
再把每个ID的TS排序
然后计算每个ID最后的优先级总和
标志为1就是还在优先缓存的饭店
数量加起来就是答案

# include <iostream>
using namespace std;
int id[100001]={
    
    0};
int ts[100001]={
    
    0};

int from[100001]={
    
    0};
int to[100001]={
    
    0};

int judge[100001]={
    
    0};
int N,M,T;

void sort(int left,int right)
{
    
    
	if(left>=right)
		return ;
	int i=left;
	int j=right;
	int pivot=id[left];
	int temp=ts[left];
	while(i<j)
	{
    
    
		while(i<j && id[j]>=pivot)
			j--;
		if(i<j)
		{
    
    
			id[i]=id[j];
			ts[i]=ts[j];
		}
			
		while(i<j && id[i]<=pivot)
			i++;
		if(i<j)
		{
    
    
			id[j]=id[i];
			ts[j]=ts[i];
		}
			
		id[i]=pivot;
		ts[i]=temp;
		sort(left,i-1);
		sort(i+1,right);
	}
}

void sort_ts(int left,int right)
{
    
    
	if(left>=right)
		return ;
	int i=left;
	int j=right;
	int temp=ts[left];
	while(i<j)
	{
    
    
		while(i<j && ts[j]>=temp)
			j--;
		if(i<j)
			ts[i]=ts[j];
			
		while(i<j && ts[i]<=temp)
			i++;
		if(i<j)
			ts[j]=ts[i];

		ts[i]=temp;
		sort_ts(left,i-1);
		sort_ts(i+1,right);
	}
}

void find_sort(int num)
{
    
    
	int i,j,k;
	int begin=-1,end=M-1;
	for(i=0;i<M;i++)
	{
    
    
		if(id[i]==num)
		{
    
    
			begin=i;break;
		}
	}
	if(begin==-1)
		return ;
	for(i=begin;i<M;i++)
	{
    
    
		if(i==(M-1))
		{
    
    
			end=i;break;
		}
		if(id[i]!=num && i<(M-1))
		{
    
    
			end=i-1;break;
		}
	}
	from[num]=begin;to[num]=end;
	sort_ts(begin,end);
}



void cal(int num)
{
    
    
	if(from[num]==0 && to[num]==0)
		return ;
	int flag=0;
	int score=0;
	int begin=from[num];
	int end=to[num];
	int i,temp;
	for(i=begin;i<=end;i++)
	{
    
    
		if(i!=begin)
		{
    
    
			if(ts[i]!=ts[i-1])
				temp=score-(ts[i]-ts[i-1]-1);
			else
				temp=score-(ts[i]-ts[i-1]);
			if(temp>0)
				score=temp;
			else
				score=0;
		}
		score=score+2;
		if(flag==0 && score>5)
			flag=1;
		else if(flag==1 && score<=3)
			flag=0;
	}
	temp=score-(T-ts[end]);
	if(temp>0)
		score=temp;
	else
		score=0;
	if(flag==0 && score>5)
		flag=1;
	else if(flag==1 && score<=3)
		flag=0;
	if(flag==1)
		judge[num]=1;
}

int main()
{
    
    
	cin>>N>>M>>T;
	int i,sum=0;
	for(i=0;i<M;i++)
		cin>>ts[i]>>id[i];
		
	sort(0,M-1);
	for(i=0;i<N;i++)
		find_sort(i+1);
	
	for(i=1;i<=N;i++)
		cal(i);
	for(i=1;i<=N;i++)
		if(judge[i]==1)
			sum++;
	cout<<sum;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43665650/article/details/105695791