POJ 1581 优先队列 priority_queue -- 比赛胜者求解
生活随笔
收集整理的這篇文章主要介紹了
POJ 1581 优先队列 priority_queue -- 比赛胜者求解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://poj.org/problem?id=1581
題目大意:
給定選手姓名,及答題提交次數(提交正確前,錯誤一次罰20分),每題的做題時間罰分(未正確作答的不罰分),最后求誰是勝出者(優先條件,答對題目多,次要條件,總罰分最低)。
輸入格式:
Line 1 < nTeams >
Line 2 - n+1 < Name > < p1Sub > < p1Time > < p2Sub > < p2Time > … < 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
解讀一下第3位答題者:
Penguins
1 15
3 120
1 300
4 0
第1題:1次對,罰15分
第2題:3次對,罰120分,另前2次提交錯誤,罰40分
第3題:1次對,罰300分
第4題:4次錯,不罰分
匯總,答對3題,罰分 = 15+120+40+300 = 475
Sample Output
Penguins 3 475
思路
- 創建類,每個對象對輸入的數據進行處理計算,計算其答對的題,和罰分
- 把每個對象push進優先隊列
- 類創建 < 操作符,先按照答對題數多的優先出隊,然后相等情況下,按照罰分少的優先出隊
Accepted 代碼如下:
/*** @description: poj 1581 judge winner 判斷勝者是誰* @author: michael ming* @date: 2019/4/5 16:00* @modified by: */ #include <string> #include <iostream> #include <queue> using namespace std; class Competitor { private:string name; //姓名int submitTime[4]; //提交次數int penaltyPoint[4]; //罰分void cal_solved_and_penalty() //計算求解題目數量,罰分{for(int i = 0; i < 4; ++i){if(penaltyPoint[i] != 0){solved++;total_penalty += 20*(submitTime[i]-1) + penaltyPoint[i];}}} public:int total_penalty; //罰分int solved; //求解題目數量Competitor(string &str, int* info):total_penalty(0),solved(0) //構造函數,傳入姓名和數據數組{name = str;for(int i = 0, j = 0; i < 4; ++i, ++j) //傳進來的數據賦值給類成員{submitTime[i] = info[j++];}for(int i = 0, j = 1; i < 4; ++i, ++j){penaltyPoint[i] = info[j++];}cal_solved_and_penalty(); //計算求解題目數量,罰分}string getName() const //獲取私有成員值{return name;} }; bool operator<(const Competitor &a, const Competitor &b) //操作符 {if(a.solved < b.solved) // "<"為從大到小排列,">"為從小到大到排列return true; //解題數目多的,大先出隊else if(a.solved > b.solved)return false;else{if(a.total_penalty > b.total_penalty)return true; //罰分少的,小的先出隊elsereturn false;} } int main() {int nums_of_player; //選手個數cin >> nums_of_player;priority_queue<Competitor> playerQueue; //選手隊列int info[8]; //4個題目答題數據string name; //姓名for(int i = 0; i < nums_of_player; ++i){cin >> name; //獲取姓名for(int j = 0; j < 8; ++j) //獲取答題數據cin >> info[j];Competitor player(name,info); //根據輸入的數據,建立選手類對象playerQueue.push(player); //將對象壓入優先隊列(優先隊列會按優先級排序)}cout << playerQueue.top().getName() << " " << playerQueue.top().solved << " "<< playerQueue.top().total_penalty << endl; //打印隊首的類對象return 0; }總結
以上是生活随笔為你收集整理的POJ 1581 优先队列 priority_queue -- 比赛胜者求解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql format row_MyS
- 下一篇: php判断全是中文正则,php判断是否为