排名
题目描述
有N支球队(编号0~N_1)比赛,他们进行多轮比赛。每一场比赛,获胜方得3分,败方得0分,如果是平局,双方都得1分。两支不同球队之间可以进行多 次比赛,每支球队的总得分是它每场比赛得分的总和。现在告诉你到目前为止各支球队的总得分,问:如果每支球队再赛一场(如何安排各球队之间比赛赛是你决定 的,而且你还可以决定他们的比赛结果),最后算出各球队的总得分,把他们按总到低排序(相同得分的球队,编号小的排在前),那么第0支球队的最优排名可以 排第几名(排名越优)?排名的下标从1开始。
输入
第1行:一个整数N,2≤N≤50,并且是偶数。
第2行:N个整数,第i个数表示目前第i支球队的总得分。注意:输入数据保证,目前名得分的状态是合法,则可以通过某些比赛达到状态。各个数都不大于1000000。
输出
一个数,表示如果各球队再赛一场,第0支球队的最优排名是多少?注意:两球队之间可以比赛多次。
样例输入
4
4 7 7 7
样例输出
2
提示
球队0赢球队l,球队2赢球队3,最后各球队的总得分分别是:7,7,8,7。支球队排第二。
首先把所有球队都减去球队零的分数,那么球队零肯定得3分的, 那么比球队零多 1~2分要打成平局得 1 分才保证不会超过,比球队零多3分的要输球得0分才行, 比球队零多3分以上的队伍以及比球队零分数低的队伍输赢都不起作用了 。
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); int n; int s[53]; cin >> n; for(int i = 0; i < n; i++){ cin >> s[i]; if(i > 0) s[i] -= s[0]; } s[0] = 3; int a = 1,b = 0, c = 0, d = 0; for(int i = 1;i <n; i++){ if(s[i] >=1 && s[i]<= 2) b++; else if(s[i] > 3) a++; else if(s[i] == 3) c++; else d++; } if(b % 2 == 1) c++; if(a+d >= c) printf("%d ", a); else { int sum = c - a - d; sum /= 2; printf("%d ", a+sum); } return 0; }