题目描述
在一条大路一旁有许多栋楼,每栋楼里有许多小学生(哈哈哈一波小学生来袭!)。但是这条路上没有小学!!!!所以唯恐世界不乱的牛A打算在路上(汽车什么的都不敢来这个小学生云集的地方咯,所以不用担心安全问题)任选一点(可以和楼重合,当然也可以不重合)建立一个小学,且使所有小学生上学走的路程之和最短。
输入格式:
第1行一个整数n(1 <= n <= 10000),表示路两旁楼的数量。
接下来的n行,每行2个整数ai(0 <= ai <= 20000)和bi(1<= bi <= 10),分别表示楼的横坐标(真的很巧,所有楼都在同一条直线上,即纵坐标都相等)和楼里小学生的人数。
数据保证ai互不相同。
输出格式:
所有小学生走的最小的路程之和。
友情提示
所有数据的n均大于1000
题解
带权中位数,很明显了吧?还是一维的
顺手就码出来了,c++自带快排好评,终于摆脱了苦逼的fp(大概?)
代码
#include <stdio.h>
#include <cmath>
#include <algorithm>
using namespace std;
struct pos
{int a,b;
};
pos x[10001];
int n;
bool cmp(pos x,pos y)
{return x.a>y.a;
}
int main()
{int sum=0;scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d%d",&x[i].a,&x[i].b);sum+=x[i].b;}sort(x+1,x+n+1,cmp);int f,t=0,ans=0;for (int i=1;i<=n;i++){t+=x[i].b;if (t>sum/2){f=x[i].a;break;}} for (int i=1;i<=n;i++)ans+=x[i].b*abs(f-x[i].a);printf("%d\n",ans);return 0;
}