题目描述
有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;
}