1. 程式人生 > >POJ 1581 優先佇列題解

POJ 1581 優先佇列題解

POJ1581競賽決定

 

問題描述:

判斷程式設計競賽是一項艱苦的工作,要求參賽者、單調乏味的決定和單調乏味的工作。更不用說12小時內只吃甜甜圈、比薩餅和蘇打水作為食物的營養問題了。不過,這也會帶來很多樂趣。

自動化評判過程的軟體是一個很大的幫助,但是眾所周知的一些競賽軟體的不可靠性使人們希望有更好的東西可用。您是試圖基於模組化設計原理開發更好、開源、競賽管理軟體的團隊中的一員。

你的元件是用來計算程式設計競賽隊的分數和確定勝利者。你將得到來自幾個球隊的結果,並且必須確定勝利者。

得分

一個團隊的得分有兩個組成部分。首先是問題的解決。第二個是懲罰點,它反映了在解決問題之前作出的時間和錯誤提交的時間。對於正確解決的每個問題,罰分等於解決問題的時間加上每次錯誤提交的20分鐘。沒有懲罰點被新增到從未解決的問題中。

所以如果一支球隊在第二次投球時在二十分鐘內解決了一個問題,他們將被罰40分。如果他們提交問題2次三次,但不解決,則不收取任何罰金點。如果他們提交問題3一次,並在120分鐘內解決,他們將被罰120罰分。他們的總分是兩個問題,用160個點數來解決。

勝利者是解決大多數問題的團隊。如果球隊為了解決大多數問題而打平,那麼勝利者就是罰點數最少的球隊。

輸入:

對於你的程式正在進行的程式設計競賽,有四個問題。你保證輸入不會導致隊之間在扣分後打成平局。

第1行<團隊>

第2行-N+1 < Name > P1SUP> P1TIME> <2SUP> <2P>< P4TIME >

行中的第一個元素是團隊名稱,它不包含空格。接下來,對於四個問題中的每一個,是團隊提交針對該問題的執行的次數以及正確解決問題的時間(兩個整數)。如果一個團隊沒有解決問題,時間將是零。如果問題解決,提交的數量將至少是一個。

輸出:

輸出由單行組成,其中列出了獲勝的團隊的名稱、他們解決的問題的數量以及罰時。

 

Sample Input

4
Stars 2 20 5 0 4 190 3 220
Rockets 5 180 1 0 2 0 3 100
Penguins 1 15 3 120 1 300 4 0
Marsupials 9 0 3 100 2 220 3 80

Sample Output

Penguins 3 475

 

簡析:用結構體儲存,再用優先佇列按解題數和罰時排序,最後輸出佇列首元素。

程式碼如下:

//
//  POJ1581.cpp
//  VOJ程式設計
//
//  Created by Mac on 2018/9/20.
//  Copyright © 2018年 Mac. All rights reserved.
//


#include <iostream>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
struct node{
    string name;
    int sol;
    int wpt;

    bool operator < (const node &a) const{
        if(sol==a.sol){
            return wpt > a.wpt;
        }
        else
            return sol < a.sol;
    }
};

int main(){
    priority_queue<node> q;
    node t;
    int n;
    cin>>n;
    while (n--) {
        int a,b;
        t.wpt = 0;
        t.sol = 0;
        cin>>t.name;
        for (int i=1; i<=4; i++) {
            cin>>a>>b;
            if (b!=0) {
                t.sol++;
                t.wpt += (b+20*(a-1));
            }
        }
        q.push(t);
    }
    t = q.top();
    cout<<t.name<<" "<<t.sol<<" "<<t.wpt<<endl;
    return 0;
}