51Nod - 1521 STL +二分

原创 2016年12月21日 09:55:44

题意:

爱丽丝和鲍博喜欢玩一维战舰的游戏。他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格)。

在游戏开始的时候,爱丽丝放k个战舰在这个表格中,并不把具体位置告诉鲍博。每一只战舰的形状是 1×a 的长方形(也就是说,战舰会占据a个连续的方格)。这些战舰不能相互重叠,也不能相接触。

然后鲍博会做一系列的点名。当他点到某个格子的时候,爱丽丝会告诉他那个格子是否被某只战舰占据。如果是,就说hit,否则就说miss。

但是这儿有一个问题!爱丽丝喜欢撒谎。他每次都会告诉鲍博miss。

请你帮助鲍博证明爱丽丝撒谎了,请找出哪一步之后爱丽丝肯定撒谎了。

思路:

利用set保存各个miss点的位置,另外用cnt保存当前格子中最多能存放几个战舰,每次询问一个新的点pos,都利用二分找到这个点左右两边的第一个点l,r,这样就可以计算出增加了pos这个点前后cnt损失了多少,如果cnt < k了就输出当前询问编号,否则将pos也插入set。

一开始看错题了,没看到战舰也不能接触,所以一段长度为len的连续区间内最多能放(len+1)/(a+1)艘战舰。

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 10;

int q[MAXN];
set <int> :: iterator it;

int main() {
    int n, m, k, a;
    scanf("%d%d%d%d", &n, &k, &a, &m);
    for (int i = 1; i <= m; i++)
        scanf("%d", &q[i]);
    set <int> st;
    int cnt = (n + 1) / (a + 1);
    st.insert(0); st.insert(n + 1);
    for (int i = 1; i <= m; i++) {
        if (st.find(q[i]) != st.end()) continue;
        it = st.upper_bound(q[i]);
        int r = *it, l = *(--it);
       // printf("%d %d\n", l, r);
        int t1 = (r - l) / (a + 1), t2 = (r - q[i]) / (a + 1) + (q[i] - l) / (a + 1);
        cnt -= (t1 - t2);
       // cout << cnt << endl;
        if (cnt < k) {
            printf("%d\n", i);
            return 0;
        }
        st.insert(q[i]);
    }
    puts("-1");
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

51nod 1267 4个数和为0

思路:先n^2预处理出所有两两的组合,那么就变成要找a+b==0的问题了,那么排序O(n)去找就可以了 #include using namespace std; #define LL lo...

51nod 1267【二分】

思路: 首先我们能够很容易地想到,4个数的和,拆成两两相加:a+b=-c-d; 我们也能很轻松地求出两两之和,但是呢。。不同的和会存在相同的值相加,所以还要排除这个条件。具体操作就是标记一下,然后...

51NOD 1521 一维战舰

1521 一维战舰 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注爱丽丝和鲍博喜欢玩一维战舰的游戏。他们在一行有n个方...

51nod 1521 一维战舰

爱丽丝和鲍博喜欢玩一维战舰的游戏。他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格)。 在游戏开始的时候,爱丽丝放k个战舰在这个表格中,并不把具体位置告诉鲍博。每一只战舰的形状是 1×a 的...
  • Joovo
  • Joovo
  • 2017-01-30 23:27
  • 159

51nod 1521 一维战舰

1521 一维战舰            爱丽丝和鲍博喜欢玩一维战舰的游戏。他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格)。 在游戏开始的时候,爱丽丝放...

51nod 1267 4个数和为0(STL,二分)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267 解题方案:4个数a,b,c,d的和可以拆成(a+b)+(...

51nod 最长单增子序列 dp+(STL函数)二分

刚刚学习dp不久,然后遇到了这个题,初步开始直接使用dp虽然测试结果在gcc可以通过,可是没有通过51nod上面的全部测试点,自己开始写的代码如下: #include #include #inclu...

51nod1287 加农炮 构造顺序序列 二分查找

说出来你可能不信,今天又被秀了。 1287 加农炮 题目来源: Codility 一个长度为M的正整数数组A,表示从左向右的地形高度。测试一种加农炮,炮弹平...

51nod 1307 绳子与重物【二分+Dfs】

1307 绳子与重物 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有N条绳子编号 0 至 N - 1...

51NOD 1421 最大MOD值&&Codeforces 484 B. Maximum Value(筛法 + 二分)

传送门B. Maximum Valuetime limit per test1 secondmemory limit per test256 megabytesYou are given a sequ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)