【PTA】L2-009 抢红包 (25分)

k看了一遍老番茄的烂俗笑话,来整理一下这一道题,与其说是整理,不如说是碰巧做了出来。

在这道题中,我了解到的是algorithm标准函数库中的sort函数,可以用来根据结构体的不同变量对结构体进行排序。在此题中明确要求的是:先对总金额递减排序,如果总金额相同再对红包个数递减排序,如果红包个数还相同的话最后的区分给了编号递增排序。

在这道题中我使用的是结构体Player,定义了全局变量Player player[10000],在主函数中对player[10000]的数据进行运算。

结构体的情况:

typedef struct Player
{
    int index; //编号
    int reward;//赏金以分为单位
    bool sign;//抢过的红包标记
    int outmoney;//发出的红包金额以分为单位
    int number;//抢到的红包个数,排序时用到
    float Total;//总金额
};

sort函数用作结构体的排序时,在本题的策略采取的是sort(player,player+n,cmp);

cmp是根据需要自定义的函数。比如根据在本道题中的要求:

bool cmp(Player a,Player b)
{
    if(a.Total!=b.Total)    return a.Total>b.Total;
    else if(a.number!=b.number) return a.number>b.number;
    else return a.index<b.index;
}

主函数里边分为三部分,初始化,输入红包,排序并输出结果。

初始化:

每个参与者或说是玩家player的编号index从1到n;

赏金reward即抢到的红包金额初始化为零;

红包标记sign若抢过则为1,未抢过则为0;

发出的红包金额outmoney初始化为0;

number即抢到的红包的个数初始化为0;

Total是指赏金减去发出的红包并以元为单位,保留两位小数。

for(int i=0;i<n;i++ )//初始化
    {
        player[i].index=i+1;//给每个人编号
        player[i].sign=0;//没人抢过红包
        player[i].outmoney=0;//第i+1个人发出的红包金额
        player[i].reward=0;//第i+1个人抢到的红包金额
        player[i].number=0;//第i+1个人抢到的红包个数
    }

输入红包数据:

第i个人 法了N个红包 分别是 N1号 得到P1金额的红包 N2号 得到P2金额的红包 一次类推。。。。

for(int i=0;i<n;i++ )//随后N行
    {
        //第i+1个人发的红包
        int K;//红包个数为K
        cin>>K;
        int nk,pk;
        for(int j=0;j<K;j++)
        {
            cin>>nk>>pk;
            player[i].outmoney+=pk;
            player[nk-1].reward+=pk;
            player[nk-1].number++;
        }
    }

将总金额运算一编,用sort函数对结构体排序之后再输出即可。

for(int i=0;i<n;i++)
{
    player[i].Total=(player[i].reward-player[i].outmoney)/100.0;
}
sort(player,player+n,cmp);
cout<<setiosflags(ios::fixed)<<setprecision(2);
for(int i=0;i<n;i++)
{
    cout<<player[i].index<<" "<<player[i].Total<<endl;
}

值得注意的是,虽然有没有对setprecision(2)保留两位有效数字的操作是貌似没有影响的,但是在PTA中显示答案错误,绿绿的很难受,害得我错过了今天下午的签到,所以说,在这里想说的是include <iomanip> 和cout<<setiosflags(ios::fixed)<<setprecision(2);是需要的。

整合一下,插入代码便是:

#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;

typedef struct Player
{
    int index; //编号
    int reward;//赏金以分为单位
    bool sign;//抢过的红包标记
    int outmoney;//发出的红包金额以分为单位
    int number;//抢到的红包个数,排序时用到
    float Total;//总金额
};

Player player[10000];
bool cmp(Player a,Player b)
{
    if(a.Total!=b.Total)    return a.Total>b.Total;
    else if(a.number!=b.number) return a.number>b.number;
    else return a.index<b.index;
}

int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++ )//初始化
    {
        player[i].index=i+1;//给每个人编号
        player[i].sign=0;//没人抢过红包
        player[i].outmoney=0;//第i+1个人发出的红包金额
        player[i].reward=0;//第i+1个人抢到的红包金额
        player[i].number=0;//第i+1个人抢到的红包个数
    }
    for(int i=0;i<n;i++ )//随后N行
    {
        //第i+1个人发的红包
        int K;//红包个数为K
        cin>>K;
        int nk,pk;
        for(int j=0;j<K;j++)
        {
            cin>>nk>>pk;
            player[i].outmoney+=pk;
            player[nk-1].reward+=pk;
            player[nk-1].number++;
        }
    }
    for(int i=0;i<n;i++)
    {
        player[i].Total=(player[i].reward-player[i].outmoney)/100.0;
    }
    sort(player,player+n,cmp);
    cout<<setiosflags(ios::fixed)<<setprecision(2);
    for(int i=0;i<n;i++)
    {
        cout<<player[i].index<<" "<<player[i].Total<<endl;
    }
}

完工!!

原文地址:https://www.cnblogs.com/Andre/p/12355024.html

时间: 2024-10-03 07:46:12

【PTA】L2-009 抢红包 (25分)的相关文章

PTA - - 06-图1 列出连通集 (25分)

06-图1 列出连通集   (25分) 给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N-1N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1行给出2个整数NN(0<N\le 100<N≤10)和EE,分别是图的顶点数和边数.随后EE行,每行给出一条边的两个端点.每行中的数字之间用1空格分隔. 输出格式: 按照"{ v_1v?1?? v_2v?2?? ... v_kv?k?? 

PTA 旅游规划(25 分)

7-10 旅游规划(25 分) 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径.如果有若干条路径都是最短的,那么需要输出最便宜的一条路径. 输入格式: 输入说明:输入数据的第1行给出4个正整数N.M.S.D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N?1):M是高速公路的条数:S是出发地的城市编号:D是目的地的城市编号.随后的M行中,每行给出一条高速公路的信息,分别

【PTA】L2-001 紧急救援 (25分)

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图. 在地图上显示有多个分散的城市和一些连接城市的快速道路. 每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上. 当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队.输入格式: 输入第一行给出4个正整数N.M.S.D,其中N(2≤N≤500)是城市的个数 顺便假设城市的编号为0 ~ (N−1):M是快速道路的条数:S是出发地的城市编号:D是目的地的城市编号. 第二行

PTA 5-15 PAT Judge (25分)

/* * 1.主要就用了个sort对结构体的三级排序 */ #include "iostream" #include "algorithm" using namespace std; int perfectScore[6]; struct Node { int id; int score[6] = {-2,-2,-2,-2,-2,-2}; /* 记录每一题的分数 初始化为-2代表没答题 */ int totalScore = 0; /* 记录总分 */ int pe

PTA 10-排序6 Sort with Swap(0, i) (25分)

题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/678 5-16 Sort with Swap(0, i)   (25分) Given any permutation of the numbers {0, 1, 2,..., N-1N?1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is

PTA 09-排序2 Insert or Merge (25分)

题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/675 5-13 Insert or Merge   (25分) According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion sort rem

PTA 10-排序5 PAT Judge (25分)

题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/677 5-15 PAT Judge   (25分) The ranklist of PAT is generated from the status list, which shows the scores of the submissions. This time you are supposed to generate the ranklist for PAT. Input Spe

PTA 09-排序1 排序 (25分)

题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/720 5-12 排序   (25分) 给定NN个(长整型范围内的)整数,要求输出从小到大排序后的结果. 本题旨在测试各种不同的排序算法在各种数据情况下的表现.各组测试数据特点如下: 数据1:只有1个元素: 数据2:11个不相同的整数,测试基本正确性: 数据3:103个随机整数: 数据4:104个随机整数: 数据5:105个随机整数: 数据6:105个顺序整数: 数据7:105个逆序整数

PTA 09-排序3 Insertion or Heap Sort (25分)

题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/676 5-14 Insertion or Heap Sort   (25分) According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion s