題意:讓我們模擬醫院救治病人的過程,每次會有不同病重程度的病人來醫院,每次醫院會選擇程度最高的來救治,當輸入第一個字符爲P 後面跟着數字表示t0,s(t0),r;當字符爲A時表示醫院要選擇一名病人救治後面跟着的數字表示時間t,病重隨時間變化而變化滿足方程s(t)=s(t0)+r*(t-t0)。
思路:想解決得先學會優先隊列的使用,優先隊列存儲優先級高的在頭低的在尾,注意可能會有r相同的病人,所以存放時需要r和s(t)一起存放,可先設t爲0,由於r最大100,所以直接遍歷所有的r找出最大的s(t)即可。
代碼如下:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
char str[10];
int main()
{
int t,n,t0,s0,r,T,Case=1;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
priority_queue<int>p[105];
printf("Case #%d:\n",Case++);
while(n--)
{
scanf("%s",str);
if(str[0]=='P')
{
scanf("%d%d%d",&t0,&s0,&r);
p[r].push(s0-r*t0);
}
else
{
scanf("%d",&t);
int ans=-INF;
int pos;
for(int i=0;i<=100;i++)
{
if(!p[i].empty())
{
if(p[i].top()+i*t>=ans)
{
ans=p[i].top()+i*t;
pos=i;
}
}
}
p[pos].pop();
printf("%d %d\n",ans,pos);
}
}
}
}