您的位置:首页 > 其它

UVALive 6440 Emergency Handling 优先队列

2014-08-11 12:06 309 查看
题目连接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4451

题目意思:给你一个公式计算每个病人的危机程度,之后给你一定量的的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: