Quailty and CCPC
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=6666
题目大意:给你n个团队,d表示金牌团队的比例为10d%(0.1*d),团队排名按题目量优先,如果题目同等,罚时少的优先。题目中解释:奎尔蒂在2017年CCPC决赛中意外获得金牌和银牌。原因解释如下。根据官方规定,金牌数量是参赛队伍数量的10%,四舍五入为最接近的整数。当结果的小数部分正好是0.5时,这是不明确的。共有115个参赛队,奎尔蒂队的排名是12。组织者最初决定把数字四舍五入,所以只有11枚金牌,而奎尔蒂的球队只能赢得银牌。许多人为他辩护反对组织者,说他的团队应该得到一枚金牌。后来,组织者改变了主意,把总数凑齐,奎尔蒂的球队最终赢得了一枚金牌。现在,给你一个比赛的记分板和金牌队伍的比例,你能确定是否有一个队伍,这样他们就可以赢得一枚金牌了,如果金牌的数量是四舍五入时,分数正好是0.5,银牌如果四舍五入?我们可以理解为,只要参赛队伍的数量的10%的小数部分正好是0.5就有那么一个团队能符合题目要求,我们就直接向上取整这个这数就是该队伍的排名。其他不等于0.5的直接输出Quailty is very great即可。
代码如下:
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
struct Team
{
char str[15];
ll p, t;
bool operator<(const Team &q) const//重载 < 运算符 题目量不相等时,罚时少的在前面
{
if (p != q.p)
return p > q.p;
return t < q.t;
}
};
Team Te[100005];
ll t, n, d;
int main()
{
ios::sync_with_stdio(false);
cin >> t;
while (t--)
{
cin >> n >> d;
for (ll i = 1; i <= n; ++i)
cin >> Te[i].str >> Te[i].p >> Te[i].t;
sort(Te + 1, Te + 1 + n);//对团队进行排名
double ans = n * (d * 10) / 100.0;//计算能拿到金牌数的比例
int res = ((int)(ans * 10)) % 10;//取得小数部分
if (res == 5)//如果小数部分刚好等于5,直接输出ans向上取整的数,即是该团队的排名
{
int i = ceil(ans);
cout << Te[i].str << endl;//输出该团队的名称
}
else
cout << "Quailty is very great" << endl;//如果不等于5输出Quailty is very great
}
return 0;
}