zoukankan      html  css  js  c++  java
  • [Sdoi2016]征途

    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 2
    1 2 5 8 6

    Sample Output

    36

    HINT

    1≤n≤3000,保证从 S 到 T 的总路程不超过 30000

    忘了附题解

    式子拆开后等于

    m*∑xi^2 - sum^2

    所以写出dp方程:

    f[i][j]=f[i-1][k]+(s[j]-s[k])^2

    于是直接斜率优化

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 #include<cstring>
     5 using namespace std;
     6 int s[3001],f[3001][3001],q[3001],head,tail,n,m,ans=2e9;
     7 double A(int i, int p) 
     8 {
     9   return (double)f[p][i] + s[i]*s[i];
    10 }
    11 double slope(int j,int k,int p) 
    12 {
    13     return (double)(A(j,p)-A(k,p))/(double)(s[j]-s[k]);
    14 }
    15 int main()
    16 {int i,j;
    17   cin>>n>>m;
    18   for (i=1;i<=n;i++)
    19     scanf("%d",&s[i]),s[i]+=s[i-1];
    20   for (i=1;i<=n;i++)
    21     f[1][i]=s[i]*s[i];
    22   for (i=2;i<=m;i++)
    23     {
    24       head=1;tail=1;
    25       q[1]=i-1;
    26       for (j=i;j<=n;j++)
    27     {
    28       while (head<tail&&slope(q[head],q[head+1],i-1)<=2.0*s[j]) head++;
    29       f[i][j]=f[i-1][q[head]]+(s[q[head]]-s[j])*(s[q[head]]-s[j]);
    30       while (head<tail&&slope(q[tail-1],q[tail],i-1)>=slope(q[tail],j,i-1)) tail--;
    31       tail++;
    32       q[tail]=j;
    33      }
    34     }
    35   cout<<f[m][n]*m-s[n]*s[n];
    36 }
  • 相关阅读:
    Odoo Documentation : Fields
    Odoo models.py BaseModel
    Odoo Documentation : Environment
    Odoo Documentation : Recordsets
    Odoo中使用的部分表名及用途
    Odoo启动过程
    6779. Can you answer these queries VII
    1874 素数和最大
    3150 Pibonacci数
    2817 Tangent的愤怒
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/7741141.html
Copyright © 2011-2022 走看看