UVa 10137 The Trip (數學題)

來源:互聯網
上載者:User

 

題目連結:

    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;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.