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

ACM模版描述题解好长时间没有见过51更新4级以下的题了,今天多了一道从CF上抓来的题,很有趣,区间问题,对于我这种做题少的人来说是一种区间新题型。比较简单的是直接上STL的set,用二分搞搞(代码O...
  • f_zyj
  • f_zyj
  • 2016年10月17日 19:56
  • 902

51nod 1521 一维战舰

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

51nod1001

#include #include int find(int num[],int n,int x) {     int low,high,mid;     low=0;high=n-1;     w...
  • stay_accept
  • stay_accept
  • 2015年04月01日 14:14
  • 645

【堆】二分堆的实现以及STL中的堆

堆的概念binary_heap就是一种完全二叉树,也就是说整棵二叉树除了最底层的叶节点之外,是填满的,而最底层的叶节点由左至右又不得有空隙。底层实现就是一个数组 vector。 如果有一个关键码的集...
  • wenqiang1208
  • wenqiang1208
  • 2017年08月16日 17:13
  • 316

STL中提供-二分查找算法(binary_search lower_bound upper_bound equal_range)

STL包含四种不同的二分查找算法,binary_search    lower_bound  upper_bound   equal_range.他们作用的range是已sorted。 bina...
  • zhongkeli
  • zhongkeli
  • 2011年10月18日 09:09
  • 7536

hdu1397素数筛+打表+标记+二分

呵呵呵呵呵。。 代码: #include #include #include #include using namespace std; const int maxn = 1 ...
  • wsn564533648
  • wsn564533648
  • 2016年09月30日 18:16
  • 140

51NOD 1105 第K大的数(二分好题)

传送门 数组A和数组B,里面都有n个整数。数组C共有n^2个整数,分别是A[0] * B[0],A[0] * B[1] ……A[1] * B[0],A[1] * B[1]……A[n - 1] * B...
  • qingshui23
  • qingshui23
  • 2016年07月15日 21:36
  • 1581

STL 二分查找三兄弟(lower_bound(),upper_bound(),binary_search())

一:起因 (1)STL中关于二分查找的函数有三个:lower_bound 、upper_bound 、binary_search  —— 这三个函数都运用于有序区间(当然这也是运用二分查找 的前提),...
  • u010700335
  • u010700335
  • 2014年11月20日 22:30
  • 2448

stl的二分函数

1.stable_sort在数组里和sort函数是一样的,区别在于前者对于数值相等的两个变量并不会交换顺序,所以只有在结构体里才能看出区别 2.lower_bound函数返回数组中第一个大于等于某数...
  • jikexueyuan5555
  • jikexueyuan5555
  • 2017年04月23日 23:41
  • 145

51nod 1624 STL妙用+二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1624 这是算法马拉松一道题。当时想法方向是正确的可惜没有想到STL...
  • xlzhang223
  • xlzhang223
  • 2016年05月06日 16:55
  • 429
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51Nod - 1521 STL +二分
举报原因:
原因补充:

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