题意:一次比赛由两个人进行,每个人可以加1分或0分。有n个人最后得分是a[i],问这些人最少进行了几场比赛
思路:注意要从大到小排序,把得分最少的放在最后
代码如下:
#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a[100005];
int main()
{
// freopen("data.txt","r",stdin);
int T;
scanf("%d",&T);
for(int kase = 1;kase <= T;++kase){
printf("Case #%d: ",kase);
int n;
scanf("%d",&n);
for(int i = 0; i < n;++i){
scanf("%I64d",&a[i]);
}
ll ans = 0;
sort(a,a+n);
reverse(a,a+n);
for(int i = 0,p = 1; i < n&&p<n; ){
while(a[i]){
if(a[p]>=a[i]){
ans+=a[i];a[p] -= a[i];a[i] = 0;
if(a[p] == 0)p++;
} else if(a[p]<a[i]){
ans += a[p];a[i] -= a[p];a[p] = 0;
p++;
}
}
i = p;p++;
}
ans += a[n-1];
printf("%I64d\n",ans);
}
return 0;
}