POJ 2051(最小堆/優先佇列)

_Phoenix發表於2015-09-11

聽了菊苣的話入手了一本挑戰程式設計競賽,為了突破瓶頸......這道題是一道最小堆的題,為了方(水)便(題)於是就用了優先佇列來做....

題意大致是每個id號註冊的時候佔用一定時間,然後不斷的用最短的時間註冊id號

中規中矩的一道題,過載一下運算子排好序就行了。

#include <iostream>
#include <queue>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;
struct Node
{
    int id;
    int period;
    int time;
    friend bool operator < (const Node &a, const Node &b)
    {
        if (a.time == b.time)
            return a.id > b.id;
        else
            return a.time > b.time;
    }
};

int main()
{
    priority_queue<Node> q;
    string s;
    Node point;
    int x, y;
    cin >> s;
    while (s.compare("#") != 0)
    {
        scanf("%d %d", &x, &y);
        point.id = x;
        point.period = y;
        point.time = y;
        q.push(point);
        cin >> s;
    }
    int n;
    scanf("%d", &n);
    while (n--)
    {
        Node temp = q.top();
        temp.time += temp.period;
        printf("%d\n", temp.id);
        q.pop();
        q.push(temp);
    }
}

相關文章