(不知道loli從**搞的題目系列。。。yl是啥意思啊= =)
簡單來講它選擇的座標就是橫縱座標的帶權中位數。。。atp記得當時考試的時候並不會帶權中位數所以。。。
對於這道題,它的移動代價的計算方式是曼哈頓距離,所以可以把橫縱座標分開考慮,將二維問題轉化成一維問題。首先我們可以證明選擇的點的座標一定是出現過的座標之一。因為如果選定的這個座標落在兩個相鄰的出現過的座標l和r之間,那麼我們先把l左邊的所有點都移動到l,r右邊的所有點都移動到r,這個花費是確定的。那麼假設l左邊的點權值之和大於r右邊的,那麼顯然這個選定的座標在l位置會更優,因為這種情況下只要能移動r那一部分就不要移動l那一部分,所以選在l位置能讓權值大的那一部分盡量少移動;當l左邊的點權值之和小於r右邊的也是同理。如果兩邊相等的話顯然這個點選在l和r之間的任何乙個位置是沒有影響的。
那麼我們只知道列舉所有出現過的座標進行計算一定能得到最優解,如何證明它就一定是帶權中位數呢?這個也可以簡單地證明一下,假設選定了乙個不是中位數的點t,它左邊的點權值之和wl
大於右邊的點權值和wr
,那麼把t換成更靠近中位數的t′
,假設wl
仍然大於wr
。這時候代價的變化相當於wl
那部分多移動了一段距離dis,wr
那部分少移動了一段相同的距離dis。又因為wl
,所以答案只會更優。那麼如果把t一直向靠近中位數的地方移動,答案就會一直變好。直到移動到了帶權中位數的位置,再移動就不滿足wl
了,這個時候答案就已經最優了。
所以把點分別按照橫縱座標排序然後掃瞄兩遍同時累加當前權值和sum,當sum恰好大於等於所有權值和的一半的時候停止就可以了。
#include
#include
#include
#include
using
namespace
std;
int n,px,py;
long
long tot,sum;
struct peoplea[50010];
int cmp1(people a,people b)
for (int i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a+1,a+n+1,cmp1);
for (int i=1;i<=n;i++)
}sort(a+1,a+n+1,cmp2);
sum=0;
for (int i=1;i<=n;i++)
}sum=0;
for (int i=1;i<=n;i++)
sum+=a[i].w*(abs(a[i].x-px)+abs(a[i].y-py));
printf("%i64d.00",sum);
return
0;}
YL杯超級籃球賽
operatorname jzoj13 25一年一度的高一yl杯超級籃球賽開賽了。當然,所謂超級,意思是參賽人數可能多餘 5 55 人。小三對這項籃球非常感興趣,所以一場都沒有落下。每個中午都準時守侯在籃球場看比賽。經過乙個星期的研究,小三終於對籃球的技戰術找到了一絲絲感覺了。他發現打yl杯的每個班...
YL杯超級籃球賽 Standard IO
題意 description 一年一度的高一yl杯超級籃球賽開賽了。當然,所謂超級,意思是參賽人數可能多餘5人。小三對這項籃球非常感興趣,所以一場都沒有落下。每個中午都準時守侯在籃球場看比賽。經過乙個星期的研究,小三終於對籃球的技戰術找到了一絲絲感覺了。他發現打yl杯的每個班都有一套相似的進攻戰術 ...
YL杯超級籃球賽 紀中1325 帶權中位數
一年一度的高一yl杯超級籃球賽開賽了。當然,所謂超級,意思是參賽人數可能多餘5人。小三對這項籃球非常感興趣,所以一場都沒有落下。每個中午都準時守侯在籃球場看比賽。經過乙個星期的研究,小三終於對籃球的技戰術找到了一絲絲感覺了。他發現打yl杯的每個班都有一套相似的進攻戰術 控球後衛帶球到前場,找到乙個最...