首页 > 其他分享 >CodeForces - 320E Kalila and Dimna in the Logging Industry

CodeForces - 320E Kalila and Dimna in the Logging Industry

时间:2022-11-22 21:34:40浏览次数:42  
标签:maxx Logging Kalila int Industry 砍倒 ll dp define

题意:你有要拿一把锯子砍树。锯子有有电和没电两个状态,只有在有电的时候才能工作,每次工作都可以砍1单位高度的树,然后就会没电。没电后要充电才能工作。充电有代价,代价为,当前已经砍倒的下标最大的树对应的b[i]。已知a数组递增且a[1]=1,b数组递减且b[n]=0,求砍倒所有树的最小代价。

解:显然我们只要砍倒第n棵树后就可以无限充电,所以设dp[i]为砍倒 i 所消耗的最小代价,答案为dp[n]。于是有转移dp[i]=min(dp[j]+b[j]*a[i])。接下来用一种叫斜率优化的东西优化一下。设有 j 和k,如果 k 比j更优,则有dp[j]+b[j]*a[i]>dp[k]+b[k]*a[k],移项得(dp[j]-dp[k])/(b[k]-b[j])>a[i],那么就可以用单调队列维护(dp[j]-dp[k])/(b[k]-b[j]),这看起来像个斜率,因此也叫斜率优化。

单调队列的写法和之前有点不同。

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxx 100005
#define maxn 25
#define maxm 205
#define ll long long
#define inf 1000000009
#define mod 2520
ll a[maxx]={0},b[maxx]={0};
ll dp[maxx]={0};
int q[maxx]={0};
double cal(int j,int k){
    return ((double)dp[j]-dp[k])/(b[k]-b[j]);
}
signed main() {
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%I64d",&a[i]);
    }
    for(int i=1;i<=n;i++){
        scanf("%I64d",&b[i]);
    }
    int head=1,tail=1;
    q[1]=1;
    for(int i=2;i<=n;i++){
        while(head<tail&&cal(q[head],q[head+1])<a[i]) head++;
        dp[i]=dp[q[head]]+b[q[head]]*a[i];
        while(head<tail&&cal(q[tail],i)<=cal(q[tail-1],q[tail])) tail--;
        q[++tail]=i;
    }
    printf("%I64d\n",dp[n]);
    return 0;
}
//dp[i][j]=min(dp[j]+b[j]*a[i])
View Code

 

标签:maxx,Logging,Kalila,int,Industry,砍倒,ll,dp,define
From: https://www.cnblogs.com/capterlliar/p/16916512.html

相关文章

  • pytest文档81 - 如何管理Captured logging日志
    前言pytest自动捕获级别为WARNING或以上的日志消息,并以与捕获的stdout和stderr相同的方式在每个失败测试的各自部分中显示它们。日志显示当输入pytest命令,不带任......
  • django的日志管理-logging
    django的日志使用python的logging模块logging的四个模块---logger-记录器:日志系统的入口,每个logger都是bucket,可以向这个bucket写入需要处理的信息,logger根据消息的日志......
  • shell: logging
    #!/bin/bash#asmalltoolforloggingsommething##1.readyourinput#2.savetologsfile>>~/logs/$(date+%F)#logDir='2-logs'read-p"好记性不如......
  • Entity Framework教程-日志管理(Logging)
    更新记录转载请注明出处:2022年10月29日发布。2022年10月22日从笔记迁移到博客。查看EFCore的日志在OnConfiguring方法中注册optionsBuilder.LogTo方法即可。pro......
  • 第三方模块,hashlib,subprocess,logging
    hashlib加密模块#1.加密就是把明文数据变为密文#2.加密的目的是为了保证数据的安全#3.加密后的数据是一串没有规律的字符串#4.加密后的密文越长说明使用的加密算......
  • hashlib模块、subprocess模块及logging模块简介
    昨日内容回顾第三方模块的下载使用pip语句下载,使用模块名==版本号指定模块版本,使用-i仓库地址改变下载源。使用pycharm下载操作更简单。request模块模拟浏览器......
  • 24、python函数篇 hashlib模块、subprocess模块、logging模块
    目录一、hashlib模块1、简介2、基本操作与用法二、subprocess模块1、简介2、基本操作与用法三、logging模块1、简介2、基本操作与用法一、hashlib模块1、简介什么是哈希......
  • hashlib 模块 subprocess 模块 logging日志模块
    今日内容hashlib加密模块1.何为加密将明文数据处理成密文数据让人看不懂2.为什么加密保证数据的安全3.如何判断数据是否加密的一串没有规律的字符串(数字、......
  • 10月27日内容总结——hashlib加密模块和logging、subprocess模块
    目录一、hashlib加密模块1、何为加密2、为什么加密3、如何判断数据是否以加密4、密文的长短有什么意义5、加密算法的基本操作二、加密补充说明三、subprocess模块1、subpro......
  • hashlib加密模块 subprocess模块 logging日志模块
    目录hashlib加密模块简介hashlib使用流程hashilb加密模块使用说明明文绑定密文密文长度不变多次传入密文不可解密原因加盐处理(salt)普通加盐动态加盐加密实际运用用户密码......