[Sdoi2016]征途
2017-11-30 16:33
169 查看
Description
Pine开始了从S地到T地的征途。从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站。
Pine计划用m天到达T地。除第m天外,每一天晚上Pine都必须在休息站过夜。所以,一段路必须在同一天中走完。
Pine希望每一天走的路长度尽可能相近,所以他希望每一天走的路的长度的方差尽可能小。
帮助Pine求出最小方差是多少。
设方差是v,可以证明,v×m^2是一个整数。为了避免精度误差,输出结果时输出v×m^2。
Input
第一行两个数 n、m。第二行 n 个数,表示 n 段路的长度
Output
一个数,最小方差乘以 m^2 后的值Sample Input
5 21 2 5 8 6
Sample Output
36HINT
1≤n≤3000,保证从 S 到 T 的总路程不超过 30000#include<iostream> #include<string> #define LL long long using namespace std; int n,m,L[3005]={0}; LL f[3005]={0},g[3005]={0}; LL pow(long long x){ return x*x; } LL cal(int k,int j){ return g[k]+pow(L[k])-2*L[j]*L[k]; } double slope(int j,int k,int i){ double y2=g[k]+pow(L[k]); double y1=g[j]+pow(L[j]); double x2=2*L[k]; double x1=2*L[j]; double y3=g[i]+pow(L[i]); double x3=2*L[i]; return (y2-y1)/(x2-x1)>(y3-y2)/(x3-x2); } int main() { cin>>n>>m; for(int i=1;i<=n;++i) { cin>>L[i]; L[i]+=L[i-1]; } for(int i=1;i<=n;++i) g[i]=pow(L[i]); for(int i=2;i<=m;++i) { int Q[3005]={0},head=0,tail=0; for(int j=1;j<=n;++j) { while(head<tail&&cal(Q[head],j)>cal(Q[head+1],j)) head++; int k=Q[head]; f[j]=g[k]+pow(L[j]-L[k]); while(head<tail&&slope(Q[tail-1],Q[tail],j)) tail--; Q[++tail]=j; } for(int j=1;j<=n;++j) g[j]=f[j]; } cout<<m*g -pow(L )<<endl; // system("pause"); }
相关文章推荐
- BZOJ4518 && SDOi2016 征途
- 【LOJ】#2035. 「SDOI2016」征途
- [SDOI2016 Round1] 征途[斜率优化]
- [SDOI2016]征途
- [斜率优化 DP] BZOJ 4518 [Sdoi2016]征途
- bzoj4518【SDOI2016】征途
- bzoj4518[Sdoi2016]征途 斜率优化dp
- [Sdoi2016]征途
- SDOI2016 R1 day2 T3 征途 斜率优化DP
- [SDOI2016]征途
- bzoj4518[Sdoi2016] 征途
- [Sdoi2016]征途
- 征途_召唤挂级刷怪好去处(40级后)
- 想在游戏中挣钱的必读!《征途》的工资系统分析!
- 百度金山征途上市
- 只有梦幻西游和征途游戏内没有通货膨胀
- “博客园开发者征途系列”即将有一本重磅级图书产品加入!
- 【出版直播】博客园征途系列,《设计模式——基于C#的工程化实现与扩展》电子书、示例代码发布,互动网预订开始
- 博客园开发征途新书《我也能做CTO之.程序员职业规划》出版
- 【原创:让我们一起踏上攻防的征途】――第二课 病毒在我电脑里干了什么?