说下我的思路:
假设最后各帐户金额为 X
那么存在以下等式:
帐户资金总和 - 23 * X = 所有 ((Xi - X)* 6% + (Xi - X) * 94% * 5% ) 和
其中 Xi 为帐户资金大于 X的帐户
令 G = 所有(Xi - X)* 6% + (Xi - X) * 94% * 5% ) 和
avg = ( 帐户资金总和 - G ) / 23
当G为0时, avg 为平均值,应该是最大
那么取X为最初平均值时,G应该最小,从而根据G算出的avg也比真正X要
大,这样一直逼近,直到 G - (sum - n* X) < 0.000001
#include
#include
#include
#define N 23
using namespace std;
float getValue(float data[],float x)
{
float result =0;
for(int i =0; i < N; i++)
{
if ( data[i] > x)
{
result += (data[i] - x) * 0.06 + (data[i] - x) *0.94 * 0.05;
}
}
return result;
}
int main()
{
float data[N];
float result;
float avg =0,sum = 0;
float charge = 0;
float flag = 0;
for(int i = 0; i < N; i++)
{
cout<
cin>>data[i];
sum += data[i];
}
avg = sum / N;
do
{
result = getValue(data,avg);
charge = sum - N * avg;
avg = ( sum - result) / N;
flag = abs((int)(result - charge));
}while(flag > 0.000001);
cout<
cout<
return 0;
}