codeforces 608C:(dp)

从又往左点灯塔,点亮一个的同时,往左di范围内的灯塔全部被破坏。现在能在最右端按一个灯塔,攻击范围任意,问到最后最少有几个灯塔留下

用dp瞎搞。具体看代码吧

#include"cstdio"
#include"queue"
#include"cmath"
#include"stack"
#include"iostream"
#include"algorithm"
#include"cstring"
#include"queue"
#include"vector"
#define ll long long

using namespace std;
const int MAXN = 1e6;
const int MAXE = 200500;
const int INF = 0x3f3f3f;
struct node{
    int a,b;
}x[MAXN];

int sum[MAXN];
int dp[MAXN*10];

bool cmp(node x,node y){
    return x.a<y.a;
}

int main(){
    int n;scanf("%d",&n);
    int maxv=-1;
    for(int i=0;i<n;i++) {
        scanf("%d%d",&x[i].a,&x[i].b);
        maxv=max(maxv,x[i].a);
    }
    if(n==1){
        printf("0
");
        return 0;
    }
    sort(x,x+n,cmp);
    dp[x[0].a]=1;
    for(int i=x[0].a+1,j=1;i<=maxv;i++){
        if(i>=x[j].a){
            int t=x[j].a-x[j].b-1;
            if(t>=0)dp[i]=dp[t]+1;
            else dp[i]=1;
            j++;
        }
        else dp[i]=dp[i-1];
    }
    int ans=INF;
    for(int i=x[0].a;i<=maxv;i++) ans=min(ans,n-dp[i]);
    //cout<<i<<'	'<<dp[i]<<endl;
    printf("%d
",ans);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/luxiaoming/p/5073982.html