河南省藍橋杯第十屆省賽-7-外賣店優先級

題目描述:

【問題描述】 “飽了麼”外賣系統中維護着 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

【樣例解釋】 6 時刻時,1 號店優先級降到 3,被移除出優先緩存;2 號店優先級升到 6, 加入優先緩存。所以是有 1 家店 (2 號) 在優先緩存中。

【評測用例規模與約定】 對於 80% 的評測用例,1 ≤ N, M, T ≤ 10000。 對於所有評測用例,1 ≤ N, M, T ≤ 100000,1 ≤ ts ≤ T,1 ≤ id ≤ N。

分析:

很簡單的邏輯,只要注意判斷優先緩存的建立與消除就好

代碼如下:

#include<iostream>
using namespace std;
int n,m,t;
struct shop{
	int num=-1;
	int priority=0;
	int ifprior=0;
};
shop s[100005];
int dd[100005][3];
void quicksort(int left,int right);
int partation(int left,int right);
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		s[i].num=i;
	}
	cin>>m;
	cin>>t;
	for(int i=1;i<=m;i++)
	{
		cin>>dd[i][1];
		cin>>dd[i][2];
	}
	
	//cout<<"hello"<<endl;
	quicksort(1,m);
//	cout<<"hi"<<endl;
	
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			int temp=0;
			if(dd[j][1]==1)
			{
				if(dd[j][2]==s[i].num)
				{
					s[i].priority+=2;
					temp=1;
				}
					
			}
			else
			{
				if(dd[j][2]==s[i].num)
				{
					s[i].priority+=2;
					temp=1;
				}	
				if(s[i].priority>5)
					s[i].ifprior=1;
			}
			if(temp==0)
			{
				s[i].priority--;
				if(s[i].ifprior==1&&s[i].priority<3)
					s[i].ifprior=0;
			}
		}
	}
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		if(s[i].ifprior==1)
			sum++;
	} 
	cout<<sum;
	return 0;
}
void quicksort(int left,int right)
{
	if(left<right)
	{
		int key=partation(left,right);
		//cout<<"key is "<<key<<endl;
	
		quicksort(left,key-1);
		quicksort(key+1,right);
	}
	
	return; 
}
int partation(int left,int right)
{
	
	if(left>=right)
	return left;
	int temp1=dd[left][1];
	int temp2=dd[left][2];
	int low=left;
	int high=right;
	while(low<high)
	{
		//cout<<"left: "<<left<<" right: "<<right<<endl;
		//cout<<"dd left: "<<dd[left][1]<<" dd right: "<<dd[right][1]<<endl;
		//system("pause");
		while(low<high&&dd[high][1]>=temp1) high--;
		dd[low][1]=dd[high][1];
		dd[low][2]=dd[high][2];
		while(low<high&&dd[low][1]<=temp1) low++;
		dd[high][1]=dd[low][1];
		dd[high][2]=dd[low][2];
	}
	dd[low][1]=temp1;
	dd[low][2]=temp2;
	return low;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章