4852 -- 【模擬試題】比賽
description
有兩個隊伍a和b,每個隊伍都有n個人。這兩支隊伍之間進行n場1對1比賽,每一場都是由a中的乙個選手與b中的乙個選手對抗。同乙個人不會參加多場比賽,每個人的對手都是隨機而等概率的。例如a隊有a1和a2兩個人,b隊有b1和b2兩個人,那麼(a1 vs b1,a2 vs b2)和(a1 vs b2,a2 vs b1)的概率都是均等的50%。
每個選手都有乙個非負的實力值。如果實力值為x和y的選手對抗,那麼實力值較強的選手所在的隊伍將會獲得(x-y)^2的得分。
求a的得分減b的得分的期望值。
input
第一行乙個數n表示兩隊的人數為n。
第二行n個整數,第i個數a[i]表示隊伍a的第i個人的實力值。
第三行n個整數,第i個數b[i]表示隊伍b的第i個人的實力值。
output
輸出僅包含乙個實數表示a期望贏b多少分。答案保留到小數點後一位(注意精度)。
sample input2
3 7
1 5
sample output
20.0
hint
【資料規模】
對於30%的資料,n≤50。
對於100%的.據,n≤50000;a[i],b[i]≤50000。
其實題目對於這個所謂的期望的求法已經說得很清楚了,就是算兩個隊各個隊員的差值乘以概率累加,這樣說得很抽象,舉個例子。
a隊:a b c
b隊:a b c
為了敘述方便,這裡設a>b>c>a>b>c
那麼期望為:
(a-a)^2/3+(b-b)^2/3+(c-c)^2/3
再假設這裡a>a,那麼期望為:
-(a-a)^2/3+(b-b)^2/3+(c-c)^2/3
這裡注意一點,為了保證精度,把分母放在最後除。
這樣乙個o(n^2)的演算法就可以得到了:列舉每個a隊員,再列舉每個b隊員,可以得到期望。
優化?
//很多這樣需要n^2優化至近似n的,大都有排序
我們注意到n^2的列舉有乙個地方太累了:它每次都去比較a隊員和b隊員的大小,再加起來,如果我們對a,b隊分別排序,就可以找到乙個邊界就結束,再者,這個邊界還可以用二分加速。
舉個例子。
team a: a b c d e f
team b:a b c d e f
兩個數列都是增序排序,現在列舉到隊員a,找到b隊中的c隊員比他大,那麼根據 (a-b)^2=a^2-2ab+b^2 容易知道前面肯定有2個a^2,2個b^2,後面有4個-a^2,4個-b^2.現在再討論"ab",根據結合律,有sigma(ab)=a*sigma(b),這裡對於b的處理就跟前面的b^2是一致的----記錄字首和。
#include#include#include#include#includeusing namespace std;
typedef long long ll;
typedef double d;
typedef long double ld;
ll a[100005]= ,b[1000005]= ;
ll n,sum1[100005]=,sum2[1000005]=;
int main()
ll pointer=0;
ld ans=0;
for(int i=1;i<=n;i++)
cout
}
BSOJ 3800 染色 貪心
3800 四校聯考1 染色 description 人人生而平等,然而後來人們逐漸選擇了不同的道路,人與人之間,變得不再平等。你可能會因為染上惡人之色而墮落,成為社會的敗類 你也可能因為染上善人之色,而在逆境中不斷成長。但是,紅與黑並非絕對的。所謂 近朱者赤,近墨者黑 你能改變周遭的環境,那麼周遭的...
bsoj1252 工程規劃
造一棟大樓是一項艱鉅的工程,它是有n個子任務構成的,給它們分別編號1,2,3,n 5 n 1000 由於對一些任務的起始條件有著嚴格地限制,所以每個任務的起始時間t1,t2,t3 tn並不是很容易確定的 但這些起始時間都是非負整數,因為它們必須在整個工程開始後啟動 例如 挖掘完成後,緊接著就要打地基...
串列埠程式設計485
對於波特率的設定通常使用cfsetospeed和cfsetispeed函式來完成。獲取波特率資訊是通過cfgetispeed和 cfgetospeed函式來完成的。cfsetospeed函式 標頭檔案 include 函式原型 int cfsetospeed struct termios termp...