本文提供了一段解决 UVA_11300 编程问题的 C++ 代码示例。该算法通过计算每位玩家需要支付的金币数,并使用排序和中间值来最小化交易次数,最终输出所有交易所需的最小总金额。
/*
* UVA_11300.cpp
*
* Created on: 2013年11月17日
* Author: Administrator
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1000010;
long long a[maxn];
long long c[maxn];
long long m;
long long sum;
long long x ;
long long ans;
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int i;
sum = 0;
for(i = 1 ; i <= n ; ++i){
scanf("%lld",&a[i]);//初始金币
sum += a[i];
}
m = sum/n;
c[0] = 0;
for(i = 1 ; i < n ; ++i){//求每个人实际给出的金币
c[i] = c[i-1] + a[i] - m;
}
sort(c,c+n);
x = c[n/2];
ans = 0;
for(i = 0 ; i < n ;++i){
ans += abs(x - c[i] + 0.0);
}
printf("%lld\n",ans);
// cout<<ans<<endl;
}
return 0;
}