2016 Personal Training #6 Div.2 G

題意:讓我們模擬醫院救治病人的過程,每次會有不同病重程度的病人來醫院,每次醫院會選擇程度最高的來救治,當輸入第一個字符爲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);
      }
    }
  }
}


發佈了56 篇原創文章 · 獲贊 5 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章