#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
LL n,ans=999999999;
LL w[2001000],dis[2001000],sw[2001000],val[2001000],d[2001000];
LL q[2001000];
double Slpoe(int j,int k)
{
return (dis[j]*val[j]-dis[k]*val[k])*1.0/(val[j]-val[k]);
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&w[i],&d[i]);
val[i]=val[i-1]+w[i];
dis[i]=dis[i-1]+d[i-1];
sw[i]=sw[i-1]+d[i-1]*val[i-1];// cout<<sw[i]<<" ";
}
val[n+1]=val[n];
dis[n+1]=dis[n]+d[n];
sw[n+1]=sw[n]+val[n]*d[n];
// for(int i=1;i<=n+1;i++) cout<<dis[i]<<' '<<val[i]<<' '<<sw[i]<<endl;
int l=1,r=1;
for(int i=1;i<=n;i++)
{//cout<<q[l]<<' '<<q[l+1];
while(l<r&&Slpoe(q[l],q[l+1])<dis[i])l++;//l+1比l更优,向上走
LL j=q[l];
ans=min(ans,sw[n+1]-val[j]*(dis[i]-dis[j])-val[i]*(dis[n+1]-dis[i]));
while(l<r&&Slpoe(q[r-1],q[r])>Slpoe(q[r],i)) r--;
q[++r]=i; //cout<<i<<' '<<j<<endl;
}
printf("%lld\n",ans);
return 0;
}【CEOI2004】锯木厂选址(斜率优化入门题)
C++程序算法解析
最新推荐文章于 2021-10-29 00:49:53 发布
本文介绍了一个使用C++实现的复杂算法案例,涉及动态规划、数据结构操作等关键概念。通过对输入数据进行处理,利用自定义的数据结构进行优化计算,最终得出最优解。此算法适用于解决特定类型的问题,并在性能上有所提升。
1576

被折叠的 条评论
为什么被折叠?



