题目意思:给你一个公式计算每个病人的危机程度,之后给你一定量的的admission表示这个时间允许治疗一个病人,让你每次输出当前时间下,危险程度最高的病人。
分析:可以对公式预处理一下,存一个处理 S= st0 - R * T0, 这样子,就相当于每个人都是进来的初始时间一样。 公式变成 ans =S + R * T ; 现在就只剩下 S 和 R这两个变量。 我们可以每次按照 相同的R 值, 比较S 找出 S 最大的值 就是每个人最危险的。 然后比较这些 S 输出 最大的那个S。 可以用默认的优先队列。直接就能输出相同R下S的最大值。
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <bitset>
#include <queue>
#define MIN (1<<30)-1
#define exp 1e-8
using namespace std;
#define ll long long
struct pat{
int st,r;
}p[100086];
int Max[105],maxx;
priority_queue < int > q[110];
int main()
{
int i,j;
int st,t0,r,a;
int T,n;
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
for(i=0;i<=100;i++)
Max[i]=-MIN;
for(i=0;i<=110;i++) //清空队列 初始化
{
while(!q[i].empty())
q[i].pop();
}
printf("Case #%d:\n",t);
scanf("%d",&n);
char str;
for(i=0;i<n;i++)
{
getchar();
j = 0;
scanf("%c", &str);
if(str == 'P')
{
scanf("%d%d%d",&t0,&st,&p[j].r);
p[j].st = st - t0 * p[j].r;
q[p[j].r].push( p[j].st );
}
else if(str == 'A')
{
scanf("%d",&a);
int s;
int ans = -MIN , num;
for( s = 0; s<=100 ; s++)
{
if(!q[s].empty())
{
if(ans <= q[s].top() + (a * s))
{
ans = q[s].top() + (a * s);
num = s;
}
}
}
q[num].pop();
printf("%d %d\n", ans , num);
}
}
}
return 0;
}