【題目描述】
幾個人一起出去吃飯是常有的事。但在結帳的時候,常常會出現一些爭執。
現在有 n 個人出去吃飯,他們總共消費了 s 元。其中第 i 個人帶了 ai 元。幸運的是,所有人帶的錢的總數是足夠付賬的,但現在問題來了:每個人分別要出多少錢呢?
為了公平起見,我們希望在總付錢量恰好為 s 的前提下,最後每個人付的錢的標準差最小。這裡我們約定,每個人支付的錢數可以是任意非負實數,即可以不是1分錢的整數倍。你需要輸出最小的標準差是多少。
標準差的介紹:標準差是多個數與它們平均數差值的平方平均數,一般用於刻畫這些數之間的「偏差有多大」。形式化地說,設第 i 個人付的錢為 bi 元,那麼標準差為 : [參見p1.png]
【輸入格式】
從標準輸入讀入資料。
第一行包含兩個整數 n、s;
第二行包含 n 個非負整數 a1, ..., an。
【輸出格式】
輸出到標準輸出。
輸出最小的標準差,四捨五入保留 4 位小數。
保證正確答案在加上或減去 10^−9 後不會導致四捨五入的結果發生變化。
【樣例1輸入】
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 ≤ 10^5;
對於所有資料,n ≤ 5 × 10^5, 0 ≤ ai ≤ 10^9。
資源約定:
峰值記憶體消耗(含虛擬機器) < 256m
cpu消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。
注意:main函式需要返回0;
只使用ansi c/ansi c++ 標準;
不要呼叫依賴於編譯環境或作業系統的特殊函式。
所有依賴的函式必須明確地在原始檔中 #include
不能通過工程設定而省略常用標頭檔案。
提交程式時,注意選擇所期望的語言型別和編譯器型別。
思路:貪心。要求最小標準差,就是要讓每個人付的錢盡可能的接近平均值。先求出初始的平均值s/n,如果有人付不起這個平均值,那麼先把他有的錢全付掉,剩下的錢再由剩下的人平分,更新平均值,繼續上述操作,直到付完所有錢為止。這裡可以先將所有人的錢從小到大排序,這樣付錢的過程中,只要有人付得起當前的平均值了,後面比他大的全都付得起了,可以減少迴圈次數。
**:
#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
int n, s;
int a[500005];
int main()
else
}ans = sqrt(ans / n);
printf("%.4lf\n", ans);
return 0;
}
第九屆藍橋杯 付賬問題
題目描述 幾個人一起出去吃飯是常有的事。但在結帳的時候,常常會出現一些爭執。現在有 n 個人出去吃飯,他們總共消費了 s 元。其中第 i 個人帶了ai 元。幸運的是,所有人帶的錢的總數是足夠付賬的,但現在問題來了 每個人分別要出多少錢呢?為了公平起見,我們希望在總付錢量恰好為 s 的前提下,最後每個...
第九屆藍橋杯省賽C A組 倍數問題(DFS)
題目描述 眾所周知,小蔥同學擅長計算,尤其擅長計算乙個數是否是另外乙個數的倍數。但小蔥只擅長兩個數的情況,當有很多個數之後就會比較苦惱。現在小蔥給了你 n 個數,希望你從這 n 個數中找到三個數,使得這三個數的和是 k 的倍數,且這個和最大。資料保證一定有解。輸入格式 從標準輸入讀入資料。第一行包括...
第九屆藍橋杯省賽C A組 航班時間
問題背景 小h前往美國參加了藍橋杯國際賽。小h的女朋友發現小h上午十點出發,上午十二點到達美國,於是感嘆到 現在飛機飛得真快,兩小時就能到美國了 小h對超音速飛行感到十分恐懼。仔細觀察後發現飛機的起降時間都是當地時間。由於北京和美國東部有12小時時差,故飛機總共需要14小時的飛行時間。不久後小h的女...