資訊學競賽總是時不時與數學產生微妙的關係,中位數及帶權中位數問題有時常常成為解題的關鍵,今日有時間,所以梳理一下。
先從一到簡單的題看起:
士兵站隊問題
在乙個劃分成網格的操場上,n個士兵散亂地站在網格點上。網格點由整數座標(x,y)表示。士兵們可以沿網格邊上、下、左、右移動一步,但在同一時刻任一網格點上只能有一名士兵。按照軍官的命令,士兵們要整齊地列成乙個水平佇列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何選擇x和y的值才能使士兵們以最少的總移動步數排成一列。
分析:這個問題我們可以把x,y分開看,兩者互不影響。其實就是求所以橫座標的中點,也就是中位數,那麼為什麼呢?
我們可以把所選定的位置左右的兩個點看成一對,只要所選位置在兩者之間,那麼長度恆等於兩點的線性距離和,所以我們可以根據每一對不斷縮小我們所選位置的範圍,最後如果有奇數個點,那麼就會在中間的那個點上,如果是偶數那麼在中間兩個數和他們所構成的區間,這樣想就容易發現中位數這一規律了。
典型的帶權中位數問題,把平面轉成線性即可。為何帶權中位數問題就是就權值的中位數呢,我們可以這麼想,不帶權的相當於權為1,每個點只有乙個人,那麼帶權就相當每個點有該點權值個人,這樣理解就與上面的思路神合了
ps:證明過程
若最優點在t
則有:∑(i<>t)<=∑(i<>t+1)
將此式化為:
∑*dist(l,t)}+∑+d[t+1]*dist(t+1,t)
<=∑*dist(l,t+1)}+∑+d[t]*dist(t,t+1) (lt+1)
即:∑-∑(l=∑-∑(d[r]*dist(r,t+1))(r>t+1)+d[t+1]*(dist(t,t+1))進一步化簡為:
∑(l<=t)<=∑(r>=t+1)∵dist(l,t)-dist(l,t+1)=dist(t,t+1)
dist(r,t+1)-dist(r,t)=dist(t+1,t)
obviously : dist(t,t+1)=dist(t+1,t)
因此:∑d[l](l<=t)>=∑(d[r])(r>=t+1)
即:∑d[l](l=∑(d[r])(r>t)
因此我們發現,若t是最優點,則必有其左邊的權值和加上d[t]後大於右邊的權值和
而類似的,我們可以證明其右邊的權值和加上d[t]後大於左邊的權值和
因此我們要找的點也就是滿足以上條件的點。注意到此時我們的選擇已經和具體的位置(座標)沒有關係了,而成為主要考慮因素的僅僅是各點上的權值。
因為左邊的權值和數+d[t]>=右邊的權值和,那麼:
leftsum+d[t]>=rightsum=sumall-(leftsum+d[t])
=>2*(leftsum+d[t])>=sumall
=>2*rightsum<=sumall
同理可得:
rightsum+d[t]>=leftsum=sumall-(rightsum+d[t])
=>2*(rightsum+d[t])>=sumall
=>2*leftsum<=sumall
此時我們發現:
2*leftsum<=sumall 而 2*(leftsum+d[t])>=sumall
也即是說當前的位置t上的數包含了第[(sumall)/2]個數,由開篇的簡述可知,這第[(sumall)/2]個數,就是這個序列中的帶權中位數。所以這一類問題,實質上就是帶權中位數問題。
#include#include#include#include#includeusing namespace std;
struct data
;data num[50003];
int n,i,j,k;
double sum,ans,xx,yy;
int xl,yl;
int cmp(data a,data b)
}for (i=1;i<=n;i++)
ans+=num[i].w*(abs(num[i].x-xl));
sort(num+1,num+n+1,cmp1);
for (i=1;i<=n;i++)
}for (i=1;i<=n;i++)
ans+=num[i].w*(abs(num[i].y-yl));
printf("%0.2lf",ans);
}
中位數及帶權中位數題集
codevs 3625 1 include 2 using namespace std 3int x 11111 y 11111 4 intmain 5code codeforces round 512 div.2,based on technocup 2019 elimination round ...
帶權中位數
話說在3085年,外星人打算來入侵地球,這個訊息被我國的情報部門秘密截獲,於是便打算聯絡世界各個國家,一 起研究商量對策。由於每個國家所需派的技術員人數不同,所以目前無法決定到底要在哪個國家設定個研究所進行 研究,幸運的是所有國家都在一條直線上,現在知道每個國家與我國的距離和該國的研究員人數。請你為...
演算法研究 帶權中位數問題
1 對於x1,x2,xn的中位數即各xi的帶權中位數,此處權值wi 1 n,i 1,2.n 此時x1,x2.xn的中位數為xk,k n 1 2 則x1,x2.x k 1 的權值和為 n 1 2 n n 1 2n 1 2 2 通過排序,在o nlgn 的最壞情況時間內求出n個元素的帶權中位數 先用堆排...