Codefrences #336 C. Chain Reaction

题目传送门

//解题思路参考了[点这里](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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值