Codeforces Round #600 (Div. 2) E .Antenna Coverage

#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int dp[N];
int x[85],r[85];
int main() {
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; ++i) {
        scanf("%d%d",x+i,r+i);
    }
    dp[m+1]=0;
    for(int i=m; i>=1; --i) {
        int pos=i;
        dp[i]=1+dp[i+1];//从右往左
        for(int j=1; j<=n; ++j) {
            int _x=x[j],_r=r[j];
            if(_x>=pos) {//如果在某个天线的左边
                if(_x-_r<=pos) {//如果在天线的覆盖范围之内
                    dp[i]=min(dp[i],dp[min(m+1,_x+_r+1)]);//就不用花费,往前面倒腾,而且不能出界
                } else {//如果不在覆盖范围之内
                    dp[i]=min(dp[i],_x-_r-pos+dp[min(m+1,2*_x-pos+1)]);//扩展距离的费用 +   原本需要花费的钱
                                                        //_x-(pos-x) 也是往前倒腾       因为往左扩展的同时也会往右扩展
                                                        //而此时左边还没有赋值,就往前
                }
            } else {//如果在某个天线的右边
                if(_x+_r>=pos) {//如果在范围之内
                    dp[i]=min(dp[i],dp[min(m+1,_x+_r+1)]);//同理,往前搞
                }
                //在右边的情况不用讨论,因为它一定会在某个天线的右边
                //当位于最右边且且覆盖不的时候,第19行已经进行了处理
            }
        }
    }
    printf("%d\n",dp[1]);
}
/*
dp[m+1]=0,我们接下来从大到小遍历pos pospos,来求出dp[] dp[]dp[],假设现在要求dp[pos] dp[pos]dp[pos],那么我们枚举所有的电线杆
dp[pos]=1+dp[pos+1] dp[pos]=1+dp[pos+1]dp[pos]=1+dp[pos+1],代表从x-1位置扩展到x
当Xi>=pos,且Xi-ri<=pos,则dp[pos]=min(dp[pos],dp[min(xi+ri+1,m+1)])  要判段是否出界
当Xi>=pos,且Xi-ri>pos ,dp[pos]=min(dp[pos],xi-ri-pos+dp[min(2*xi-pos+1,m+1)])
当xi<pos,且xi+ri>=pos,则dp[pos]=min(dp[pos],dp[min(xi+ri+1,m+1)])
当xi<pos,且xi+ri<pos,则不用当前 antenna扩展
*/

猜你喜欢

转载自www.cnblogs.com/QingyuYYYYY/p/11930388.html