跳绳比赛2(AC)

题目描述

有n个人参加跳绳比赛,比赛规则如下:

  • 1分钟内单人跳绳次数为个人成绩,按成绩由高到低排名,只有前八名有得分,依次为9,7,6,5,4,3,2,1,其余人得分为0。如果不满八人,则只有前n-1名有得分,依次为n,n-2,n-3,...,1,其余人得分为0。
  • 不足3人参加跳绳比赛时,比赛成绩作废,参赛者得分均为0。
  • 如果成绩相同,则排名并列,得分也相同。
  • 破纪录者,得分翻倍。

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

输入

第一行两个整数n,m,用空格隔开,n表示参与人数,m表示历史最高记录。
第二行n个整数,用空格隔开,第i个数ai表示第i个人的1分钟内单人跳绳次数。

输出

输出一行n个整数,用空格隔开,第i个数表示第i个人的得分。

样例输入 Copy
【样例1】
10 401
27 233 233 337 402 189 142 248 44 50
【样例2】
6 420
269 309 240 292 402 243
样例输出 Copy
【样例1】
0 5 5 7 18 3 2 6 0 1
【样例2】
2 4 0 3 6 1
提示

注:打破纪录是指超过原来记载的最高成绩。
数据范围
1≤n≤200
对于100%的数据,0≤ai≤453。
 

刚保存第一题的代码...这下是真的倒头就睡了ZZZ

速速修改完直接拿下

代码

#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[209];
int record, n;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值