前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POJ 1581 优先队列 priority_queue -- 比赛胜者求解

POJ 1581 优先队列 priority_queue -- 比赛胜者求解

作者头像
Michael阿明
发布2021-02-20 10:34:36
4510
发布2021-02-20 10:34:36
举报
文章被收录于专栏:Michael阿明学习之路

题目链接: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 代码如下:

代码语言:javascript
复制
/**
 * @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;    //罚分少的,小的先出队
        else
            return 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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/04/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目大意:
  • 思路
  • Accepted 代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档