第九屆藍橋杯省賽C A組 付賬問題

2021-09-11 19:36:45 字數 1767 閱讀 2789

【題目描述】

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

現在有 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的女...