把每个城市看成一个点,城市有几个人意味着有几个这样的点,
然后找中位数就好了(证明很显然)
代码如下:
#include <stdio.h>
int N, amount;
struct district
{
int cor, plt; // ×ø±ê£¬ÈË¿Ú
}city[15005] = {0}, tmp;
void sort(int l, int r)
{
int i = l, j = r;
tmp = city[l];
while(i < j)
{
while(i < j && tmp.cor <= city[j].cor) --j;
city[i] = city[j];
while(i < j && tmp.cor >= city[i].cor) ++i;
city[j] = city[i];
}
city[i] = tmp;
if(i > l) sort(l, i - 1);
if(j < r) sort(j + 1, r);
}
int main()
{
int i;
scanf("%d", &N);
for(i = 1; i <= N; ++i)
{
scanf("%d%d", &city[i].cor, &city[i].plt);
amount += city[i].plt;
}
sort(1, N);
if(amount & 1) amount = (amount + 1) >> 1;
else amount >>= 1;
for(i = 1; i <= N; ++i)
{
amount -= city[i].plt;
if(amount <= 0)
break;
}
printf("%.5f", (float)city[i].cor);
return 0;
}