codeforce608c Chain Reaction

题意:n个炮台的坐标和攻击范围,只能向左攻击,可以在所有炮台位置最后部署一个炮台,攻击范围自定,问最多能有几个炮台留下

题解:可以发现只能拆后面的炮台,dp[i]代表i后面的炮台被拆除留下的炮台个数,二分找第一个摧毁不到的位置

#include <bits/stdc++.h>
using namespace std;
struct node{
    int a,b;
}m[100100];
int dp[100100];
int cmp(node c,node d){
    return c.a<d.a;
}
int main()
{
    int n, mid, ans=-1;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>m[i].a>>m[i].b;
    sort(m ,m+n, cmp);
    for(int i=0;i<n;i++){
        int l = -1,r = n;
        while(l+1<r){
            mid  = (l+r)>>1;
            if(m[i].a-m[i].b > m[mid].a) l = mid;
            else r = mid;
        }
        if(l == -1) dp[i] = 1;
        else dp[i] = dp[l]+1;
        ans = max(ans, dp[i]);
    }
    cout<<n-ans<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/Noevon/p/7106193.html