【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\n",dp[M]);
    return 0;
}
posted @ 2019-12-22 21:52  流浪AC  阅读(128)  评论(0编辑  收藏  举报