题目链接: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);
}
}