校內模擬 YL杯超級籃球賽(中位數)

2021-07-24 13:21:54 字數 1550 閱讀 6204

(不知道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杯的每個班都有一套相似的進攻戰術 控球後衛帶球到前場,找到乙個最...