• 【Coreforces 1253E】


    题意:一个长为M的街道,安装一个设备,现在有这种设备N个,这种设备在[x-s,x+s]这段区间内可以使用,增加区间大小1格需要收取1费用
    求使设备能够正常使用所需的最小费用。
    题解:首先想到是暴力并考虑每种状态,压缩时间空间复杂度后
    1、使每个状态初始时保证最大值。
    2、遍历分两种
    ① 当i<=x时,若i在当前所便利的设备覆盖的区间内或者之前有设备覆盖区则等于之前存储的最大值,否则等于本身。
    dp[i]=min(dp[i],dp[max(num[j].l-num[j].r-1,0)]);
    ② 当i>x时,面对这种情况时,可能之前的信号覆盖区已将覆盖,如果没有,添加信号覆盖区i-num[j].r-num[j].l
    dp[i]=min(dp[i],dp[max(2*num[j].l-i-1,0)]+max(i-num[j].r-num[j].l,0));

    /*
     * 2019.12.22
     * */
    #include <cstdio>
    using namespace std;
    const int MAXN = 1e5+5;
    struct node{
        int l,r;
    }num[100];
    int dp[MAXN];
    int max(int a,int b){
        return a>b?a:b;
    }
    int min(int a,int b){
        return a<b?a:b;
    }
    int main(){
        int N,M;
        scanf("%d%d",&N,&M);
        for(int i=0;i<N;i++){
            scanf("%d%d",&num[i].l,&num[i].r);
        }
        for(int i=0;i<=M;i++){
            dp[i]=i;
        }
        for(int i=1;i<=M;i++){
            for(int j=0;j<N;j++){
                if(i<=num[j].l){
                    dp[i]=min(dp[i],dp[max(num[j].l-num[j].r-1,0)]);
                }
                else{
                    dp[i]=min(dp[i],dp[max(2*num[j].l-i-1,0)]+max(i-num[j].r-num[j].l,0));
                }
            }
        }
        printf("%d
    ",dp[M]);
        return 0;
    }
    
  • 相关阅读:
    elasticsearch如何设计索引
    LinkedList 的实现原理
    聊聊elasticsearch7.8的模板和动态映射
    elasticsearch7.8权限控制和规划
    cloudera manager server迁移
    2020年终总结
    工作两年半的一次复盘
    聊聊数据结构和算法
    AutoMapper源码解析
    [源码解析] 并行分布式框架 Celery 之 worker 启动 (2)
  • 原文地址:https://www.cnblogs.com/Vagrant-ac/p/12081261.html
Copyright © 2020-2023  润新知