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 1521 一维战舰

思路:插入一个miss的时候计算下减少的可以放的船的数量,模拟下就好了。注意船不能接触(至少隔开一个位置)。 用的set找左右值,慢了点#include using namespace std; #...
  • naipp
  • naipp
  • 2016年10月22日 17:06
  • 488

51NOD 1521 一维战舰

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

51nod 1521 一维战舰

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

51nod 1521 一维战舰

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

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

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267 解题方案:4个数a,b,c,d的和可以拆成(a+b)+(...
  • mr_zj_
  • mr_zj_
  • 2017年04月07日 13:08
  • 96

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

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

51nod 1562 玻璃切割 (STL map+一点点的思考)

1562 玻璃切割 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 现在有一块玻璃,是长方形的(w 毫米× h 毫米),...

51nod 1024 矩阵中不重复的元素 (STL)

一个m*n的矩阵。 该矩阵的第一列是a^b,(a+1)^b,.....(a + n - 1)^b 第二列是a^(b+1),(a+1)^(b+1),.....(a + n - 1)^(b+1) .....

51nod 1640 天气晴朗的魔法 【二分枚举最大生成树】or【最小&&最大 生成树】

这样阴沉的天气持续下去,我们不免担心起他的健康。51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动。N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的魔力连接起来,形成一个魔法阵...

51nod 1460:连接小岛 贪心二分

1460 连接小岛 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51Nod - 1521 STL +二分
举报原因:
原因补充:

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