1235 付賬問題

2022-09-21 06:27:11 字數 1923 閱讀 5288

幾個人一起出去吃飯是常有的事。

但在結帳的時候,常常會出現一些爭執。

現在有 \(n\) 個人出去吃飯,他們總共消費了 \(s\) 元。

其中第 \(i\) 個人帶了 \(a_i\) 元。

幸運的是,所有人帶的錢的總數是足夠付賬的,但現在問題來了:每個人分別要出多少錢呢?

為了公平起見,我們希望在總付錢量恰好為 \(s\) 的前提下,最後每個人付的錢的標準差最小。

這裡我們約定,每個人支付的錢數可以是任意非負實數,即可以不是 \(1\) 分錢的整數倍。

你需要輸出最小的標準差是多少。

標準差的介紹:標準差是多個數與它們平均數差值的平方平均數,一般用於刻畫這些數之間的「偏差有多大」。

形式化地說,設第 \(i\) 個人付的錢為 \(b_i\) 元,那麼標準差為 :

第一行包含兩個整數 \(n、s\);

第二行包含 \(n\) 個非負整數 \(a_1, …, a_n\)。

輸出最小的標準差,四捨五入保留 \(4\) 位小數。

資料範圍

\(1≤n≤5×10^5,\)

\(0≤a_i≤10^9,\)

\(0≤s≤10^\)。

輸入樣例1:

5 2333

666 666 666 666 666

輸出樣例1:
0.0000
輸入樣例2:
10 30

2 1 4 7 4 8 3 6 4 7

輸出樣例2:
0.7928
貪心

貪心策略:先將陣列排序,依次遍歷,如果當前數小於平均數,則該數全選上,差值由後面的數平攤

證明:

首先有均值不等式:若 \(x_1+x_2+...+x_n=s\),則 \(\frac\geq (\frac)^2\) 當且僅當 \(x_1=x_2=...=x_n\) 時 \(=\) 成立

為了防止大的數能被利用到,而小的數又能充分利用,即大的數影響不大到小的數,因為大的數影響小的數隻會使答案變差,所以先排序,對於當前數 \(a_i\),有兩種情況:

// problem: 付賬問題

// contest: acwing

// url:

// memory limit: 64 mb

// time limit: 1000 ms

// // powered by cp editor (

// %%%skyqwq

#include //#define int long long

#define help

#define pb push_back

#define fi first

#define se second

#define mkp make_pair

using namespace std;

typedef long long ll;

typedef pairpii;

template bool chkmax(t &x, t y)

template bool chkmin(t &x, t y)

template void inline read(t &x)

while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();

x *= f;

}const int n=5e5+5;

int n,a[n];

long double s;

int main()

printf("%.4lf",sqrt(res/n));

return 0;

}

1235 會場安排問題

題目描述 學校的小禮堂每天都會有許多活動,有時間這些活動的計畫時間會發生衝突,需要選擇出一些活動進行舉辦。小劉的工作就是安排學校小禮堂的活動,每個時間最多安排乙個活動。現在小劉有一些活動計畫的時間表,他想盡可能的安排更多的活動,請問他該如何安排。輸入 第一行是乙個整型數m m 100 表示共有m組測...

藍橋杯 付賬問題 2023年

付賬問題 問題描述 問題的簡單分析 首先這是乙個 貪心問題 為了使標準差最小,每乙個人出的錢 bi 必須接近平均值。1 ai bi時 必須交上所有的錢,這樣才能保證標準差盡可能的小 2 ai bi時 這類人不僅要交平均值s n,還要平攤沒帶夠錢的人的費用 因此有 include using name...

第九屆藍橋杯 付賬問題

題目描述 幾個人一起出去吃飯是常有的事。但在結帳的時候,常常會出現一些爭執。現在有 n 個人出去吃飯,他們總共消費了 s 元。其中第 i 個人帶了ai 元。幸運的是,所有人帶的錢的總數是足夠付賬的,但現在問題來了 每個人分別要出多少錢呢?為了公平起見,我們希望在總付錢量恰好為 s 的前提下,最後每個...