題目連結:
http://uva.onlinejudge.org/index.phpoption=com_onlinejudge&Itemid=8&page=show_problem&problem=1078
題目意思:
給出n個人的花費情況,以美元為單位,精確到美分,然後要你求出最小的總交易額使得每人付出的錢數之差在1美分。
解題思路:
先求出平均每人應該支付的錢數,去掉美分後面的,精確到美分,記為aver,每人應該支付的應該是aver或aver+0.01,然後統計比該錢數大的人數ca,比較sum-aver*n與ca*0.01的大小,盡量讓出錢多的人付aver+0.01的份額,這錢使付錢少的的人盡量出aver的份額,這樣可以使得總的交易額達到比較小的水準。具體詳見代碼。
代碼:
#include<iostream>#include<cmath>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<algorithm>#include<vector>#include<map>#define eps 1e-6#define INF (1<<20)#define PI acos(-1.0)using namespace std;int main(){ int n; double money[1200]; while(scanf("%d",&n)&&n) { double sum=0; for(int i=1;i<=n;i++) { scanf("%lf",&money[i]); sum+=money[i]; } double aver=(int)(sum/n*100)*.01; double ans=0; int ca=0; //計數大於aver錢數的人數 for(int i=1;i<=n;i++) if(money[i]<aver) ans+=aver-money[i]; //如果付錢少了,則應該付錢 else if(money[i]>aver) ca++; if(sum-aver*n==0||sum-aver*n<ca*.01) printf("$%.2lf\n",ans); else printf("$%.2lf\n",ans+sum-aver*n-ca*.01);//盡量讓付錢多的人付aver+0.01的份額 } return 0;}