标签:node 51nod1110 ll 中位数 距离 带权 include
1110 距离之和最小 V3
- 1.0 秒
- 131,072.0 KB
- 40 分
- 4级题
X轴上有N个点,每个点除了包括一个位置数据X[i],还包括一个权值W[i]。点P到点P[i]的带权距离 = 实际距离 * P[i]的权值。求X轴上一点使它到这N个点的带权距离之和最小,输出这个最小的带权距离之和。
收起
输入
第1行:点的数量N。(2 <= N <= 10000) 第2 - N + 1行:每行2个数,中间用空格分隔,分别是点的位置及权值。(-10^5 <= X[i] <= 10^5,1 <= W[i] <= 10^5)
输出
输出最小的带权距离之和。
输入样例
5 -1 1 -3 1 0 1 7 1 9 1
输出样例
20
把每个点看做出现了wi次,求中位数即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100005
#define ll long long
int n;
using namespace std;
struct node
{
ll x,w;
}p[maxn];
bool cmp(node a,node b)
{
return a.x<b.x;
}
int main()
{
scanf("%d",&n);
ll sum=0;
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&p[i].x,&p[i].w);
sum+=p[i].w;
}
sum/=2;
sort(p+1,p+n+1,cmp);
ll temp=0;
ll mid;
for(int i=1;i<=n;i++)
{temp+=p[i].w;
if(temp>sum)
{
mid=p[i].x;
break;
}
}
ll ans=0;
for(int i=1;i<=n;i++)
{
ans+=abs(p[i].x-mid)*p[i].w;
}
printf("%lld\n",ans);
return 0;
}
标签:node,51nod1110,ll,中位数,距离,带权,include 来源: https://blog.csdn.net/sdauguanweihong/article/details/98469542
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。