题目大意 - 翻译

  Alice 和 Bob喜欢在 \(1\times n\) 的表格中玩战舰游戏。游戏开始时,Alice 有 \(k\) 艘战舰,每艘战舰长度为 \(a\),她需要把这些战舰不重叠且不相邻地放在格子中(不允许有两艘战舰的格子存在公共边)。但她并不会告诉 Bob 她放的位置。

  接下来,Bob 会用 \(m\) 颗炮弹尝试打中 Alice 的战舰,每颗炮弹会选择一个格子打击。但由于 Alice 喜欢作弊,所以她不会告诉 Bob 什么时候击中了战舰。请你帮助 Bob 判断,在第几次发射炮弹后,Alice 一定会有一艘战舰被击中。

分析

  不难看出整个问题是具有单调性的,即炮弹打出的越多就越有可能达成“战舰肯定被打到了”这一成就。那么就直接考虑 二分答案

  当我们枚举到一个 \(mid\) 的时候,我们将所有在 \(mid\) 之前发射的炮弹对应到原表格上。得到的效果即原表格被分成了很多个区间。

  在这样的情况下如果我们考虑每一个区间的左端都被战舰占据(或不被占),且右端一定不被占据。则这样的放置方法一定是合法的,且对于每一个区间,最多可以放 \(\frac{r - l}{a + 1}\) 艘战舰。

  那么就可以求到在 \(mid\) 之前的所有炮弹打出的情况下,最多能保证多少战舰不被打到。显然如果这个个数小于 \(k\) ,这个答案就一定可以为最后答案。

  当然因为我们要找的是最小的,所以在这个时候就继续往小的找咯。

#include <cstdio>
#include <algorithm>
using namespace std; int Max(int x, int y) {return x > y ? x : y;}
int Min(int x, int y) {return x < y ? x : y;}
int Abs(int x) {return x < 0 ? -x : x;} #include <cstdio>
#include <algorithm>
using namespace std; int Max(int x, int y) {return x > y ? x : y;}
int Min(int x, int y) {return x < y ? x : y;}
int Abs(int x) {return x < 0 ? -x : x;} int read() {
int k = 1, x = 0;
char s = getchar();
while (s < '0' || s > '9') {
if (s == '-')
k = -1;
s = getchar();
}
while (s >= '0' && s <= '9') {
x = (x << 3) + (x << 1) + s - '0';
s = getchar();
}
return x * k;
} void write(int x) {
if(x < 0) {
putchar('-');
x = -x;
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
} void print(int x, char s) {
write(x);
putchar(s);
} const int MAXN = 2e5 + 5; struct node {
int id, val;
node() {}
node(int Id, int Val) {
id = Id;
val = Val;
}
} q[MAXN]; bool cmp(node x, node y) {
return x.val < y.val;
} int n, k, a, m; bool check(int mid) {
int ans = 0, last = 0;
for(int i = 1; i <= m; i++)
if(q[i].id <= mid) {
ans += ((q[i].val - last) / (a + 1));
last = q[i].val;
}
ans += ((n - last + 1) / (a + 1));
return ans < k;
} int main() {
n = read(), k = read(), a = read(), m = read();
for(int i = 1; i <= m; i++) {
q[i].val = read();
q[i].id = i;
}
sort(q + 1, q + m + 1, cmp);
int l = 1, r = m, res = -1;
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid)) {
res = mid;
r = mid - 1;
}
else
l = mid + 1;
}
print(res, '\n');
return 0;
}

Solution -「营业」「CF567D」One-Dimensional Battle Ships的更多相关文章

  1. 「LOJ#10072」「一本通 3.2 例 1」Sightseeing Trip(无向图最小环问题)(Floyd

    题目描述 原题来自:CEOI 1999 给定一张无向图,求图中一个至少包含 333 个点的环,环上的节点不重复,并且环上的边的长度之和最小.该问题称为无向图的最小环问题.在本题中,你需要输出最小环的方 ...

  2. 「题解」「美团 CodeM 资格赛」跳格子

    目录 「题解」「美团 CodeM 资格赛」跳格子 题目描述 考场思路 思路分析及正解代码 「题解」「美团 CodeM 资格赛」跳格子 今天真的考自闭了... \(T1\) 花了 \(2h\) 都没有搞 ...

  3. 「THP3考前信心赛」解题报告

    目录 写在前面&总结: T1 T2 T3 T4 写在前面&总结: \(LuckyBlock\) 良心出题人!暴力分给了 \(120pts\) \(T1\) 貌似是个结论题,最后知道怎么 ...

  4. 众安「尊享e生」果真牛的不可一世么?

    近日,具有互联网基因的.亏损大户(成立三年基本没盈利,今年二季度末亏损近4亿,你能指望它多厉害?).财产险公司—众安推出“尊享e生”中高端医疗保险(财险公司经营中高端医疗真的很厉害?真的是中高端医疗险 ...

  5. XCActionBar 「Xcode 中的 Alfred」

    下载地址:https://github.com/pdcgomes/XCActionBar 基本命令: (1)「command+shift+8」或者双击「command」键可以打开「动作输入框窗口」 ( ...

  6. Git 执行 「fork 出来的仓库」和「最新版本的原仓库」内容同步更新

    当我们在 GitHub 上 fork 出一个仓库后,如果原仓库更新了,此时怎样才能保证我们 fork 出来的仓库和原仓库内容一致呢?我们一般关注的是仓库的 master(主干分支)的内容,通过以下步骤 ...

  7. 【翻译】西川善司的「实验做出的游戏图形」「GUILTY GEAR Xrd -SIGN-」中实现的「纯卡通动画的实时3D图形」的秘密,后篇

    http://www.4gamer.net/games/216/G021678/20140714079/     连载第2回的本回,  Arc System Works开发的格斗游戏「GUILTY G ...

  8. 翻译「C++ Rvalue References Explained」C++右值引用详解 Part1:概述

    本文系对「C++ Rvalue References Explained」 该文的翻译,原文作者:Thomas Becker. 该文较详细的解释了C++11右值引用的作用和出现的意义,也同时被Scot ...

  9. 「Windows MFC 」「Edit Control」 控件

    「Windows MFC 」「Edit Control」 控件

  10. 苹果搜索广告后台大揭秘,最全最细致详解,手把手设置教程「后附官方视频」-b

    WWDC2016 搜索广告分会视频和 PPT 发布了,ASO100 带开发者第一时间了解 Search Ads 后台设置(文末有原声视频). 首先介绍一下搜索广告的模式和竞价规则 广告模式为 CPT( ...

随机推荐

  1. ubuntu 18及以上版本配置IP的方法,你get了吗

    本文讲讲 Ubuntu 18 及以上版本配置 IP 的方法,为什么它值得一讲,因为以 Ubuntu 16 为首的版本的配置方法已经不适用了,如果你还不知道,那本文正好 get 一个新技能. Ubunt ...

  2. 定时 ——setTimeout | setInterval

    使用场景,setTimeout 只调用一次,setInterval 会重复调用,直到清除或重载. <div id="countDown"></div> &l ...

  3. WPF 分组

    分组和树形结构是不一样的. 树形结构是以递归形式存在.分组是以键值对存在的形式,类似于GroupBy这样的形式. 举个例子 ID NAME SEX Class 1 张三 男 1 2 李四 女 2 3 ...

  4. Hadoop安装学习(第二天)

    学习任务: 1.对VMnet8进行设置 2.配置主机名,对host文件进行编辑 3.将Hadoop文件以及jdk通过Xshell7传输到Linux系统 4.设置免密登录

  5. break、continue、return中选择一个,我们结束掉它

      在平时的开发过程中,经常会用到循环,在写循环的过程中会有很多判断条件及逻辑,你知道如何结束一个循环吗?在java中有break.continue.reture三个关键字都可以结束循环,我们看下他们 ...

  6. 【SpringSecurity系列2】基于SpringSecurity实现前后端分离无状态Rest API的权限控制原理分析

    源码传送门: https://github.com/ningzuoxin/zxning-springsecurity-demos/tree/master/01-springsecurity-state ...

  7. 前端4BOM与DOM

    内容概要 BOM操作(了解) DOM操作 DOM操作标签 获取值操作 属性操作 事件 -事件案例 内容详情 BOM操作(了解)

  8. 开发工具-MySQL下载地址

    更新记录 2022年6月10日 完善标题. 商业版下载 商业版下载地址 https://edelivery.oracle.com/ 使用Oracle账号登录即可下载. 官方下载 https://dev ...

  9. Charles如何抓取https请求-移动端+PC端

    Charles安装完成,默认只能抓取到http请求,如果查看https请求,会显示unkonw或其它之类的响应.所以需要先进行一些配置,才能抓取到完整的https请求信息.下面针对PC端和手机端抓包的 ...

  10. JS:函数的几种写法1

    1.构造函数: var fn = new function(); 2.声明式: function fn(){}; 3.匿名函数(又称自调用函数): (function(){})(); 4.表达式: v ...