• Print Article HDU


    一道斜率dp入门题

    Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it to print articles. But it is too old to work for a long time and it will certainly wear and tear, so Zero use a cost to evaluate this degree.
    One day Zero want to print an article which has N words, and each word i has a cost Ci to be printed. Also, Zero know that print k words in one line will cost

    M is a const number.
    Now Zero want to know the minimum cost in order to arrange the article perfectly.

    InputThere are many test cases. For each test case, There are two numbers N and M in the first line (0 ≤ n ≤ 500000, 0 ≤ M ≤ 1000). Then, there are N numbers in the next 2 to N + 1 lines. Input are terminated by EOF.OutputA single number, meaning the mininum cost to print the article.Sample Input
    5 5
    5
    9
    5
    7
    5
    Sample Output
    230

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const int maxn = 1e6+10;
    
    int n,tail,head,q[maxn],m;
    
    ll f[maxn],sum[maxn];
    
    double g(int k2,int k1) {
        return double(f[k1]-f[k2]+sum[k1]*sum[k1]-sum[k2]*sum[k2])/double(2*sum[k1]-2*sum[k2]);
    }
    
    int main() {
        while(scanf("%d%d",&n,&m)!=EOF){
            for(int i=1;i<=n;i++) {
                scanf("%lld",&sum[i]);sum[i]+=sum[i-1];
                if(sum[i]==sum[i-1]) i--,n--;//不加会错。。
            }
            head=tail=1;f[0]=0;
            for(int i=1;i<=n;i++) {
                int k1=q[head],k2=q[head+1];
                while(head<tail&&g(k1,k2)<=sum[i]) 
                head++,k1=q[head],k2=q[head+1];
                f[i]=f[k1]+(sum[i]-sum[k1])*(sum[i]-sum[k1])+m;
                while(head<tail&&g(q[tail-1],q[tail])>=g(q[tail],i)) tail--;
                q[++tail]=i;
            }
            printf("%lld
    ",f[n]);
        }
        return 0;
    }
  • 相关阅读:
    为Jupyter只安装目录的扩展包
    前端菜鸟的小程序摸索记录
    小计:Shopee批量删除修复~附脚本
    Python3 与 C# 并发编程之~ 协程篇
    记一次硬件故障,并普及点硬件知识
    小计:协同办公衍生出的需求
    监控MySQL|Redis|MongoDB的执行语句(go-sniffer)
    Linux IO实时监控iostat命令详解
    Linux下的磁盘缓存
    使用top命令查看系统状态
  • 原文地址:https://www.cnblogs.com/plysc/p/10774407.html
Copyright © 2020-2023  润新知