【模板复习】
SOL
中位数是在
(
i
+
1
)
/
2
(i+1)/2
(i+1)/2的位置取得,而带权中位数是在
∑
a
[
i
]
>
=
s
u
m
(
a
[
i
]
)
/
2
\sum a[i]>=sum(a[i])/2
∑a[i]>=sum(a[i])/2的位置取得,与两点距离无关,只与权值相关
证明:设最优位置为
t
t
t
则:
∑
i
=
1
t
−
1
a
[
i
]
∗
d
i
s
[
i
,
t
]
+
∑
i
=
t
+
1
n
a
[
i
]
∗
d
i
s
[
i
,
t
]
>
=
∑
i
=
1
t
a
[
i
]
∗
d
i
s
[
i
,
t
+
1
]
+
∑
i
=
t
+
2
n
a
[
i
]
∗
d
i
s
[
i
,
t
+
1
]
\sum_{i=1}^{t-1}a[i]*dis[i,t]+\sum_{i=t+1}^{n}a[i]*dis[i,t]>=\sum_{i=1}^{t}a[i]*dis[i,t+1]+\sum_{i=t+2}^{n}a[i]*dis[i,t+1]
∑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]
∵
d
i
s
[
t
,
t
]
=
d
i
s
[
t
+
1
,
t
+
1
]
=
0
\because dis[t,t]=dis[t+1,t+1]=0
∵dis[t,t]=dis[t+1,t+1]=0
∴
∑
i
=
1
t
a
[
i
]
∗
d
i
s
[
i
,
t
]
+
∑
i
=
t
+
1
n
a
[
i
]
∗
d
i
s
[
i
,
t
]
>
=
∑
i
=
1
t
a
[
i
]
∗
d
i
s
[
i
,
t
+
1
]
+
∑
i
=
t
+
1
n
a
[
i
]
∗
d
i
s
[
i
,
t
+
1
]
\therefore \sum_{i=1}^{t}a[i]*dis[i,t]+\sum_{i=t+1}^{n}a[i]*dis[i,t]>=\sum_{i=1}^{t}a[i]*dis[i,t+1]+\sum_{i=t+1}^{n}a[i]*dis[i,t+1]
∴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
t
a
[
i
]
∗
(
d
i
s
[
i
,
t
]
−
d
i
s
[
i
,
t
+
1
]
)
>
=
∑
i
=
t
+
1
n
a
[
i
]
∗
(
d
i
s
[
i
,
t
+
1
]
−
d
i
s
[
i
,
t
]
)
\therefore \sum_{i=1}^{t}a[i]*(dis[i,t]-dis[i,t+1])>=\sum_{i=t+1}^{n}a[i]*(dis[i,t+1]-dis[i,t])
∴i=1∑ta[i]∗(dis[i,t]−dis[i,t+1])>=i=t+1∑na[i]∗(dis[i,t+1]−dis[i,t])
∵
d
i
s
[
i
,
t
]
−
d
i
s
[
i
,
t
+
1
]
(
1
<
=
i
<
=
t
)
=
d
i
s
[
i
,
t
+
1
]
−
d
i
s
[
i
,
t
]
(
t
+
1
<
=
i
<
=
n
)
\because dis[i,t]-dis[i,t+1](1<=i<=t)=dis[i,t+1]-dis[i,t](t+1<=i<=n)
∵dis[i,t]−dis[i,t+1](1<=i<=t)=dis[i,t+1]−dis[i,t](t+1<=i<=n)
∴
∑
i
=
1
t
a
[
i
]
>
=
∑
i
=
t
+
1
n
a
[
i
]
\therefore \sum_{i=1}^{t}a[i]>=\sum_{i=t+1}^{n}a[i]
∴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);
}
}