幾個人一起出去吃飯是常有的事。
但在結帳的時候,常常會出現一些爭執。
現在有 \(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 的前提下,最後每個...