题目描述
有 三个学生参加跳绳比赛,比赛规则如下:
- 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;
}