Codefrences #336 C. Chain Reaction

来源:互联网 发布:小土豆编程软件注册机 编辑:程序博客网 时间:2024/05/17 23:53

题目传送门

//解题思路参考了[点这里](http://blog.csdn.net/snowy_smile/article/details/50402271)//通过这道题,我学到了很多的东西,线将我的体会总结如下.//题意:有n(1e5)个灯塔,每个灯塔有属性(坐标a[i].first,向左的照射范围a[i].second),所有灯塔坐标两两不同。 我们从右往左,对于每个灯塔,其所照射到的所有灯塔都被认定为被破坏。 我们现在可以在所有灯塔的右边,布置一个新的灯塔,位置和范围任意定。  问你,是否有一种布置灯塔的方案,可以使得被破坏的灯塔数尽可能少,并输出最少破坏的灯塔数。//解题思路:尝试暴力! 我们发现,我们新灯塔的功能,其实是使得最右面的若干个灯塔失效。 意思就是,使得第1,2,3,4,5,……,n个灯塔,作为没被破坏的最后一个灯塔。 我们能否算出第i个灯塔,作为没被破坏的最后一个灯塔条件下的答案呢? 这个显然是很容易做到的。我们可以按照灯塔坐标对这n个灯塔做升序排序。 然后,对于第i个灯塔,它可以破坏掉的区间范围是a[i].first-a[i].second 设最后一个破坏掉的位置为pos,那么我们在a中做二分, 查找第一个位置比pos小的。之前的便全部保留了。 基于这个方式,我们就可以在O(nlogn)的条件下,枚举最后一个没被破坏的灯塔,暴力过掉这道题了。 
//AC代码如下://Created Author: just_sort//Created Time  : 2016/1/20 15:43//File  Name    : Chain Reaction#include <cstdio>#include <cstring>#include <cctype>#include <limits.h>#include <iostream>#include <algorithm>using namespace std;#define Read(x) scanf("%d",&x)const int maxn = 100010;pair <int,int> a[maxn];int n;int ans[maxn];int main(){    Read(n);    for(int i=1;i<=n;i++)    {        Read(a[i].first);        Read(a[i].second);    }    int answer=INT_MAX;    sort(a+1,a+n+1);    a[n+1].first=-1;    ans[0]=0;    for(int i=1;i<=n;i++)    {        int pos=lower_bound(a+1,a+i,make_pair(a[i].first-a[i].second,-1))-a-1;        ans[i]=ans[pos]+1;        answer=min(answer,n-ans[i]);    }    printf("%d\n",answer);    return 0;}
0 0