傳送門
【模板複習】
SOL
中位數是在(i+1)/2的位置取得,而帶權中位數是在∑a[i]>=sum(a[i])/2的位置取得,與兩點距離無關,只與權值相關
證明:設最優位置爲t
則:∑i=1t−1a[i]∗dis[i,t]+∑i=t+1na[i]∗dis[i,t]>=∑i=1ta[i]∗dis[i,t+1]+∑i=t+2na[i]∗dis[i,t+1]
∵dis[t,t]=dis[t+1,t+1]=0
∴i=1∑ta[i]∗dis[i,t]+i=t+1∑na[i]∗dis[i,t]>=i=1∑ta[i]∗dis[i,t+1]+i=t+1∑na[i]∗dis[i,t+1]
∴i=1∑ta[i]∗(dis[i,t]−dis[i,t+1])>=i=t+1∑na[i]∗(dis[i,t+1]−dis[i,t])
∵dis[i,t]−dis[i,t+1](1<=i<=t)=dis[i,t+1]−dis[i,t](t+1<=i<=n)
∴i=1∑ta[i]>=i=t+1∑na[i]
得證
代碼:
#include<bits/stdc++.h>
using namespace std;
int num=1,sum,t;
struct node{string c,d;int val;}a[5001];
inline bool cmp(const node&a,const node&b){
int register l1=a.d.length(),l2=b.d.length();
if(l1<l2)return 1;
if(l1>l2)return 0;
return a.d<b.d;
}
signed main(){
ios::sync_with_stdio(false);
while(cin>>a[num].val>>a[num].d>>a[num].c)sum+=a[num].val,num++;num--;
sort(a+1,a+num+1,cmp);
for(int register i=1;i<=num;i++){
t+=a[i].val;
if(t>=(sum+1)/2)cout<<a[i].c,exit(0);
}
}