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