跳绳比赛(AC)

题目描述

有 三个学生参加跳绳比赛,比赛规则如下:

  • 1分钟内单人跳绳次数为个人成绩,按成绩由高到低排名,第一名得4分,第二名得2分,第三名得1分。
  • 如果成绩相同,则排名并列,得分也相同。
  • 打破纪录者,得分翻倍。

给出三个人在 分钟内单人跳绳的次数,以及历史最高记录,请你帮忙计算他们的得分。

输入

第一行三个整数a,b,c,用空格隔开,依次表示A,B,C三个人1分钟内单人跳绳次数。
第二行一个整数m,表示1分钟内单人跳绳次数的历史最高记录。

输出

输出一行三个整数,用空格隔开,依次表示A,B,C三个人的得分。

样例输入 Copy
【样例1】
45 51 34
50
【样例2】
78 65 65
90
【样例3】
78 78 65
90
【样例4】
65 65 65
90
【样例5】
78 65 75
70

样例输出 Copy
【样例1】
2 8 1
【样例2】
4 2 2
【样例3】
4 4 1
【样例4】
4 4 4
【样例5】
8 1 4

提示

样例1说明
按照给出的跳绳次数将三个人排名,A,B,C三个人的排名结果为:2,1,3。其中B 打破了历史记录,得分翻倍,因此三个人的得分依次为2,8,1。
注:打破纪录是指超过原来记载的最高成绩。
数据范围
对于100%的数据,0<a,b,c<=453 。
对于其中60%的数据,a,b,c互不相等。
对于其中40%的数据, a,b,c全都小于m。

好烦

弄了一个struct,先从大到小排序,再赋分数,最后恢复序号顺序输出。

只能说比较有适用性?......

代码 

#include <iostream>
#include <algorithm>

using namespace std;
typedef long long ll;

struct compition {
    int num, mark, score, rank;
};

bool cmp1(compition x, compition y) {
    return x.num < y.num;
}

bool cmp2(compition x, compition y) {
    return x.mark > y.mark;
}

compition c[4];
int record;

int main() {
    for (int i = 0; i < 3; ++i) {
        cin >> c[i].mark;
        c[i].num = i;
    }
    cin >> record;
    sort(c, c + 3, cmp2);
    int r = 1, t = 1, s[]{ 0,4,2,1 };
    c[0].rank = r;
    for (int i = 1; i < 3; ++i) {
        if (c[i].mark != c[i - 1].mark) {
            c[i].rank = r + t;
            r += t;
            t = 1;
        }
        else {
            c[i].rank = r;
            t++;
        }
    }
    for (int i = 0; i < 3; ++i) {
        c[i].score = s[c[i].rank];
        if (c[i].mark > record) c[i].score *= 2;
    }
    sort(c, c + 3, cmp1);
    for (int i = 0; i < 3; ++i) cout << c[i].score << " ";
    cout << '\n';
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值