1. 程式人生 > 其它 >java實戰16:付賬問題

java實戰16:付賬問題

技術標籤:演算法java資料結構eclipse陣列

java實戰16:付賬問題

藍橋杯第九屆java省賽A組10.

原題:
標題:付賬問題

【題目描述】
幾個人一起出去吃飯是常有的事。但在結帳的時候,常常會出現一些爭執。

現在有 n 個人出去吃飯,他們總共消費了 S 元。其中第 i 個人帶了 ai 元。幸運的是,所有人帶的錢的總數是足夠付賬的,但現在問題來了:每個人分別要出多少錢呢?

為了公平起見,我們希望在總付錢量恰好為 S 的前提下,最後每個人付的錢的標準差最小。這裡我們約定,每個人支付的錢數可以是任意非負實數,即可以不是1分錢的整數倍。你需要輸出最小的標準差是多少。

標準差的介紹:標準差是多個數與它們平均數差值的平方平均數,一般用於刻畫這些數之間的“偏差有多大”。形式化地說,設第 i 個人付的錢為 bi 元,那麼標準差s為 :

在這裡插入圖片描述
【輸入格式】
從標準輸入讀入資料。
第一行包含兩個整數 n、S;
第二行包含 n 個非負整數 a1, …, an。

【輸出格式】
輸出到標準輸出。
輸出最小的標準差,四捨五入保留 4 位小數。
保證正確答案在加上或減去 10−9 後不會導致四捨五入的結果發生變化。

【樣例輸入】
5 2333
666 666 666 666 666

【樣例輸出】
0.0000

【樣例解釋】
每個人都出 2333/5 元,標準差為 0。

再比如:
【樣例輸入】
10 30
2 1 4 7 4 8 3 6 4 7

【樣例輸出】
0.7928

【資料約定】
對於 10% 的資料,所有 ai 相等;
對於 30% 的資料,所有非 0 的 ai 相等;

對於 60% 的資料,n ≤ 1000;
對於 80% 的資料,n ≤ 105
對於所有資料,n ≤ 5 × 105, 0 ≤ ai ≤ 109

思路:

  • 先直接按總錢數除人數算出平均錢數,錢不夠平均數的人付他所有的錢,再算剩餘那幾個人應付的平均錢數,不夠的人交出他所有的錢,夠的話剩餘的人每個人都出平均錢數。

  • 因為:標準差大小是用來衡量資料之間差距的大小。

  • 所以本題採取這種方式儘量把每個人付錢的差距降到最小,這樣算出來的就是最小標準差了。

  • 四捨五入怎麼實現:System.out.printf("%.4f",s);即可實現四捨五入。

程式碼如下:

import java.
util.Scanner; public class province_10 { public static void main(String[] args) { Scanner reader=new Scanner(System.in); int n=reader.nextInt(); double S=reader.nextInt(); double[] money=new double[n]; for(int i=0;i<n;i++) { money[i]=reader.nextInt(); } //排序 double t; for(int i=0;i<n-1;i++) { for(int j=0;j<n-1;j++) { if(money[j]>money[j+1]) { t=money[j]; money[j]=money[j+1]; money[j+1]=t; } } } //計算每個人花多少錢 double min=money[0]; double a[]=new double[n];//存每人實際付錢數 int ans=0;//計數,計有幾人錢不夠 double left=S; for(int i=0;i<n-1;i++) { if(left/(n-ans)>min) { a[i]=min;//a[0]=300//a[1]=467 left=left-min;//left=2033//left=1566 min=money[i+1];//min=467//min=600 ans++;//ans=1ans=2 } else { for(int j=ans;j<n;j++){//j=2//j=3//j=4 a[j]=left/(n-ans);//a[2]=522//a[3]=522//a[4]=522 } } } //計算標準差 double aver=S/n;double sum=0; for(int i=0;i<n;i++) { sum+=(a[i]-aver)*(a[i]-aver); } double s=Math.sqrt(sum/n);//開方的方法 System.out.printf("%.4f",s); } } /* 5 2333 666 666 666 666 666 */ /* 10 30 2 1 4 7 4 8 3 6 4 7 */

第一組測試資料結果:
在這裡插入圖片描述

第二組測試資料結果:
在這裡插入圖片描述