您的位置:首页 > 其它

洛谷 P3819 松江1843路

2017-07-03 15:40 106 查看
一个小小的技巧:输出long long最大值

printf("%lld",(long long)1e19);

因为long long最大不是9*10^18所以输1e19就行啦
然后本题就是个三分,很容易看出这个函数是凸函数。注意本题要用long long。

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
const long long oo=9223372036854775807;
const double res=10;
struct node{
long long x,r;
}house[100005];
long long lenth,n;
long long distan(long long x)
{
long long sum=0;
for(int i=1;i<=n;i++)
sum+=(abs(x-house[i].x)*house[i].r);
return sum;
}
int main()
{
long long l=oo,r=-oo-1,ans=oo;
scanf("%lld%lld",&lenth,&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&house[i].x,&house[i].r);
l=min(l,house[i].x);
r=max(r,house[i].x);
}
l=min(l,(long long)0);
r=max(r,lenth);
long long ll,rl,lm,rm;
while(r-l>res)
{
lm=l+(r-l)/3,rm=r-(r-l)/3;
ll=distan(lm),rl=distan(rm);
if(ll>=rl)
l=lm;
else
r=rm;
}
for(long long i=max(l-10,(long long)0);i<=min(r+10,lenth);i++)
ans=min(ans,distan(i));
printf("%lld",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: