Codeforces 607A Chain Reaction (dp+二分)

来源:互联网 发布:网络借贷系统 编辑:程序博客网 时间:2024/05/31 19:18

题目链接:http://codeforces.com/problemset/problem/607/A


题意:有n个灯塔,点亮一个灯塔会摧毁该灯塔左边距离x以内的灯塔,现在可以在最右边放置一个位置和摧毁距离任意的灯塔,问最少可以摧毁多少个灯塔


思路:dp[i]表示i为最右边的灯塔时剩下的灯塔数,利用二分查询找到离灯塔i最近存活的灯塔j,dp[i]=dp[j]+1,n减去存活最多的存活数就是最小摧毁数


#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;struct Node{    int pow,pos;}s[1000030];bool cmp(Node p,Node q){    return p.pos<q.pos;}int dp[1000030];int main(){    int n;    while (scanf("%d",&n)!=EOF)    {        int res=0x3f3f3f3f;        memset(dp,0,sizeof(dp));        for (int i=0;i<n;i++)        {            scanf("%d%d",&s[i].pos,&s[i].pow);        }        sort(s,s+n,cmp);        for (int i=0;i<n;i++)        {            Node tmp;            tmp.pos=s[i].pos-s[i].pow;            int low=lower_bound(s,s+n,tmp,cmp)-s;            //cout<<low<<endl;            if (low==0)                dp[i]=1;            else                dp[i]=dp[low-1]+1;            res=min(n-dp[i],res);        }        printf("%d\n",res);    }}


0 0