One-Dimensional Battle Ships CodeForces - 567D (二分做法+解释)

MacTeX+TeXstudio:Macbook配置本地Latex看这一篇就够了 这个博客记录本人在MacBook上配置本地Latex的流程,其中选择的编译环境为MacTeX,编辑器为TeXstudio。采用的原因主要两点:一个是本人配置的原因主要是用来撰写毕业论文,希望能够尽可能简化设置流程,专注内容表达;第二是由于本人还有一个windows系统的笔记本,想要编辑器在专注写作体验的同时在两个系统上能够都适配,从而减少切换效率,故选择此组合。这篇文章介绍并详细记录了本人的安装流程,有相同需求的同志也可借鉴。 阅读详情

One-Dimensional Battle Ships

CodeForces - 567D

Alice and Bob love playing one-dimensional battle ships. They play on the field in the form of a line consisting of n square cells (that is, on a 1 × n table).

At the beginning of the game Alice puts k ships on the field without telling their positions to Bob. Each ship looks as a 1 × a rectangle (that is, it occupies a sequence of a consecutive squares of the field). The ships cannot intersect and even touch each other.

After that Bob makes a sequence of "shots". He names cells of the field and Alice either says that the cell is empty ("miss"), or that the cell belongs to some ship ("hit").

But here's the problem! Alice like to cheat. May be that is why she responds to each Bob's move with a "miss".

Help Bob catch Alice cheating — find Bob's first move, such that after it you can be sure that Alice cheated.

Input

The first line of the input contains three integers: n, k and a (1 ≤ n, k, a ≤ 2·105) — the size of the field, the number of the ships and the size of each ship. It is guaranteed that the n, k and a are such that you can put k ships of size a on the field, so that no two ships intersect or touch each other.

The second line contains integer m (1 ≤ m ≤ n) — the number of Bob's moves.

The third line contains m distinct integers x1, x2, ..., xm, where xi is the number of the cell where Bob made the i-th shot. The cells are numbered from left to right from 1 to n.

Output

Print a single integer — the number of such Bob's first move, after which you can be sure that Alice lied. Bob's moves are numbered from 1 to m in the order the were made. If the sought move doesn't exist, then print "-1".

Example
Input
11 3 3
5
4 8 6 1 11
Output
3
Input
5 1 3
2
1 5
Output
-1
Input
5 1 3
1
3
Output
1
题目意思:给出 1 * n 的 field,编号从左至右依次为 1,2,...,n。问射 m 枪之后(第 i 次射中编号 xi,则 xi 这一点是不能放置船只的!),能不能将 k 只 1 * a 的小船放到这些没有经过被射中编号的 field 中 。由于Alice 每次 shoot 的时候都会说 miss 的,即没有打中,你需要判断第几次shoot 使得整个field 不能放置 k 只 小船,如果都能放,最终输出 - 1.


分析:根据题意我们知道放置每条船的时候每条船不能相接触(也就是不能相连,船的摆放不能是连续的),所以每条船之间相隔1的距离即可,那么对于长度为n的表,我们可以列出方程 ,设可以放置x条船,则有(a*x)+(x-1)*1 = n.  (解释:放置x条船中间就会有x-1个为1间隔总长度为n)解得  x = (n+1)/(a+1) (注意这里的n代表实际我要放船的长度,+1实际是虚的我们假设多出1)这里对于后面解题是关键

举个例子a=1 ,总表长n = 7

有                            1     2     3     4     5     6     7     8(虚的我们假设多1)

                               船           船          船           船       

所以实际一条船占2个位置,这样我们正好算出这个长度下可以放8/2=4条船

那么利用二分,边界是l=1,r=m二分出轰炸的次数times,根据前times次轰炸的位置(已知),我们可以把原本总的长度为n的表分成times+1个部分,对着times+1个部分,分别计算出每个部分可以放下船的个数,求个总和,然后和k(实际放的个数)作比较(这就是代码中check函数的作用)

如果总和恰好等于k或者大于k说明,爱丽丝完全可以在鲍勃轰炸这times个位置的情况下放置大于等于条船,因此可以骗过鲍勃,也就是鲍勃需要检查更多次,此时舍去左区间即l = mid+1,反之,如果总数小于了k,说明在鲍勃轰炸times个位置的情况下,爱丽丝最多最多放的船小于k条,因为实际放了k条说明放的多出的那几条肯定能被炸到,说明此时的tiems可以说明爱丽丝骗人了,但还要继续二分找最小,所以舍去右区间r=mid-1.

整体思路是这样

具体代码细节的分析将在代码中解释:

code:


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 200100
#define INF 0x3f3f3f3f
using namespace std;
int n,k,a,m;
int x[MAXN],x2[MAXN];
int check(int times){//解这道题的关键就在于这个check函数
    int i;
    for(i = 1; i <= times; i++){//把前times次的轰炸位置暂存下来
        x2[i] = x[i];
    }
    sort(x2+1,x2+times+1);//排好序,这样从头往后遍历被分成的部分
    int l = 1,tot = 0;
    for(i = 1; i <= times; i++){
        //这里需要花时间解释一下,因为这里我也好久才明白。根据前面解释在长度为n的长度内
        //可以放置的船的条数是(n+1)/(a+1),n是实际的放置长度而+1是虚的只是我们故意多出1,这样整除出结果
        //但是问题是我将整个长度分成了连续的times+1个部分,如果每部分都加上虚的1,就把整体表变长了
        //而我们还得有间隔,那么只好让每部分的末尾舍去1,这样对于中间的长度为nn的每部分,我们实际的放置
        //长度是nn-1,而我们是从下标1开始记录,所以x2[i]-L恰好是L~x2[i]这段长度-1,然后根据公式实际长度是
        //nn-1 = x2[i]-L,所以放置个数为x2[i]-L+1/(a+1),也就是下面代码的这样写的原因
        int len = (x2[i]-l)+1;
        tot += len/(a+1);
        l = x2[i]+1;
    }
    //上面说的是中间部分,而对于最后一部分,因为最后一条船可以放在表尾边上,不需要空出一个1
    //或者说我们可以假设后面多一个虚的1,这样的话,实际放置长度就应该是L~n的长度n-L+1,然后根据公式
    //再加1除(a+1)得到最后一部分放置船的个数
    tot += ((n-l+1)+1)/(a+1);
    //最后求和比较
    if(tot >= k)
        return 1;
    return 0;
}
int main(){
    scanf("%d%d%d%d",&n,&k,&a,&m);
    int i;
    for(i = 1; i <= m; i++)
        scanf("%d",&x[i]);
    int l = 1,r = m,ans = INF;//边界
    while(l<=r){//二分
        int m=(l+r)/2;
        if(check(m))//前面整体思路中已经解释,不在赘述
            l = m+1;
        else{
            r = m-1;
            ans = min(ans,m);
        }
    }
    if(ans == INF)
        ans = -1;
    printf("%d\n",ans);
    return 0;
}



高通SDX55平台:5G速率问题排查分析方法 和大家分享一下高通5G平台5G速率问题排查分析方法。 阅读详情

相关推荐

RK3566基于Buildroot定制QT开发环境的完整指南

本文详细介绍了如何在RK3566开发板上使用Buildroot定制QT开发环境的完整流程。从基础环境搭建、Buildroot初始配置到QT模块选择与编译验证,提供了实战经验和常见问题解决方案,帮助开发者高效完成嵌入式Linux下的QT开发环境部署。

weixin_26804345的博客 357

<Zhuuu_ZZ>大数据技术之Flume详解

Flume详解一 Flume配置环境配置验证二 Flume测试1、nc2、Netcat Source-Memory Channel-Logger Sink3、Exec Source-File Channel-Logger Sink4、Spooling Directory Source-File Channel-Logger Sink5、Spooling Directory Source-File Channel-HDFS Sink 一 Flume配置 环境配置 解压 重命名为flume160 进入flume

Zhuuu_ZZ的博客 1951

FPGA SPI驱动ADC避坑指南:以ADC128S022为例,详解时序设计与代码调试

本文以ADC128S022为例,详细解析FPGA通过SPI驱动ADC的时序设计与代码调试中的常见问题。从时钟分频计算、SPI模式选择到状态机实现,提供避坑指南和实战技巧,帮助工程师解决数据采集系统中的时序匹配难题。特别针对FPGA与ADC通信中的微妙差异,给出精确的Verilog代码示例和ModelSim仿真验证方法。

weixin_42522374的博客 458

567. 字符串的排列

给定两个字符串s1和s2,写一个函数来判断s2是否包含s1的排列。 换句话说,第一个字符串的排列之一是第二个字符串的子串。 示例1: 输入: s1 = "ab" s2 = "eidbaooo" 输出: True 解释: s2 包含 s1 的排列之一 ("ba"). 示例2: 输入: s1= "ab" s2 = "eidboaoo" 输出: False 注意: 输入的字符串只包含小写字母 两个字符串的长度都在 [1, 10,000] 之间 import ja...

allway2的博客 2391

高通QCS2290 SecureBoot全流程实战:从密钥生成到NON-HLOS.bin生成

本文详细拆解了高通QCS2290平台SecureBoot安全启动技术的端到端实战流程。从开发环境搭建、RSA密钥对生成与证书链构建,到关键XML配置文件修改、固件编译与数字签名,最终完成NON-HLOS.bin集成打包,为嵌入式开发者提供了一份清晰、可操作的安全启动部署指南。

weixin_28273593的博客 298

滤波器初步入门(非常全面)

主要关注的是-3dB这个点,-3dB就是截止频率所对应的点,我们把功率降至50%以下的信号定义为被衰减掉了(但要跟实际情况相结合,有些信号衰减-3db不够,需要衰减更多)-3dB这个点对应我们的电压来说是0.707。设计电路可以留一定的余量,如果你把4k设计为截止频率,那么4k时候衰减倍数为-3dB通常是不够的,你可以将截止频率设为2k,那么4k的衰减就可以达到15dB(假设),根据自己的需要去设计对应的截止频率。理想的滤波器是当输入的信号频率大于截止频率时,大于部分的频率对应的电压信号直接归0。

yybyybds的博客 5719

CodeForces 567D One-Dimensional Battle Ships

题意:有一个一维线段,上面摆了k个船,每个船的长度都为a,然后有一个人来打,问你第几次攻击 就可以使得这个船无论怎么摆都不合法了 思路:一个区间合并的题,对于每一次的攻击,都只会影响到这个点所在区间,然后我们更新一下新出现的两个区间里面能摆多少个船就好了 #include using namespace std; sets; mapvis; int main() { int n

围巾的ACM博客 407

Leads、SDR、MQL、SQL、L2C术语概念,线索创建与清洗、线索分级模型、线索流转策略、线索的统计与分析

CRM中的“Leads”是什么?笔者在文中不仅较为全面地介绍了相关术语概念,还分析了线索的创建与清洗、线索的分级模型、线索流转策略以及线索的统计与分析。

盼盼学士 5954

codeforces-567-D: One-Dimensional Battle Ships(Set | 权值线段树)

题目:http://codeforces.com/problemset/problem/567/D 题意:n个位置,k条船,每条占a个连续位置,任意两条船不能重叠或相邻,每次破坏一个位置,问破坏几次后放不下k条船。 思路:对于i条船,至少需要 i*k+ i-1 个连续的位置才可以放下,对于一段长len的连续位置有等式i*k + i-1 <= len,至多可以放(len+1)/(a+1...

A_Thinking_Reed_的博客 347

uniapp [安卓苹果App端] - 实现集成微信一键登录及授权获取用户信息全流程源码,uniApp唤起微信客户端app实现微信授权头像昵称手机号(提供移动应用/开放平台/资质认证/签名/权限申请

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,微信一键登录,uniapp项目App端实现微信登录,Uniapp实现微信授权登录,调起微信客户端授权用户信息,uniappapp端微信一键登录打开手机微信app,app端如何唤起用户本机微信应用并授权登陆,如何申请微信一键登录,uniapp实现APP微信登录流程,打开本地微信软件,接入微信登录,UniApp实现微信登录教程,获取头像昵称手机号用户数据,超详细实现微信登录功能,唤起没反应,授权失败,获取

🏆 前端领域优质创作者 1万+

Aip1640、TM1640驱动程序

本文介绍了AIP1640/TM1640驱动芯片的编程实现,主要包括硬件接口定义和通信协议函数。通过宏定义配置时钟(CLK)和数据线(DIO)的GPIO控制,实现了I2C协议的启动、停止、字节发送等基本操作。核心函数AIP1640_Disp_Drive()完成显示驱动流程:先发送0x40命令设置地址自增模式,再发送0xC0起始地址和16字节显示数据,最后设置亮度参数。文中还包含5微秒延时函数、显示数据缓冲区定义,以及LED和数码管(SMG)的位映射注释说明。该代码适用于控制LED数码管显示,支持亮度调节功能。

zqx的博客 1400

【打CF,学算法——三星级】CodeForces 567D One-Dimensional Battle Ships (二分)

题目链接:CF 567D 题面: D. One-Dimensional Battle Ships time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Alice and B

David_Jett 1094

SQL的基本介绍

1.什么是数据库?2.什么是数据库管理系统?3.什么是 SQL?1.数据库是保存有组织的数据的容器,通常是一个文件或一组文件,可以将其看作电子化的文件柜。用户可以对文件中的数据执行新增、删除、更新、查询等操作。2.数据库管理系统是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户可以通过 DBMS 访问数据库中的数据,数据库管理员也可以通过 DBMS 进行数据库的维护工作。

shiwei0813的博客 2878

codeforces 567D. One-Dimensional Battle Ships

D. One-Dimensional Battle Ships time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Alice and Bob love playing o

LJQ 745

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

codeforces#314D&567D One-Dimensional Battle Ships (Set)

题目大意:http://codeforces.com/problemset/problem/567/D点击打开链接 有一个n*1的矩形格子,alice可以往里边放k个(1*a)的船,每个船不能交叉和接触比如【1,2】【3,4】不行~~然后bob炮轰格子,问几步可以保证他一定打到船 解题思路:二分+Set,每打一次,更新下去区间,看能放下的船数是否为减少~~ #include #inclu

h123120的专栏 747

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

[CodeForces 567D] One-Dimensional Battle Ships (区间隔断计数)

CodeForces - 567D 给定一个序列,上面有 K艘长度为 A的船互相不相邻地摆放在一起 Bob 每次都射击一个位置,Alice每次都告诉他没中 问到第几次射击的时候,可以判断出 Alice在说谎 Alice在说谎,说明射击点将区间分割成的若干个区间放不下 K艘船 一开始想着用单调队列维护了一个 DP,然后搞了些奇怪的做法,然后就 WA了事实上这题很简单,用一个 set维

MisDeer's blog 483

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【Codeforces 567D】One-Dimensional Battle Ships

【链接】 我是链接,点我呀:) 【题意】 长度为n的一个序列,其中有一些部分可能是空的,一些部分是长度为a的物品的一部分 (总共有k个长度为a的物品,一个放在位置i长度为a的物品会占据i,i+1,....i+a-1这a个格子 (物品之间必须要有至少一个空格,不能相邻 现在有一个人猜了m个不同的位置 你每次都说那个位置不是物品的一部分。(骗他) 那么请问最少在第几次你会露馅?(知道...

AWCXV 113

set codeforces567D One-Dimensional Battle Ships

题意:有一个长度为n的区间,现在有k个长度为a的东西,放在长度为n的区间上,且这k个东西没有重叠或接触的地方,也就是两两直接至少中间隔了一个空位 现在Bob按顺序选择了许多个点,Bob每选择一个点,Alice都会撒谎说这个点没有被覆盖,问,Bob在选了哪些点后,能确定Alice一定在说谎,也就是,在第几个点的时候,可以确定这个点一定被覆盖了 思路: ans记录上一次中区间内最多能放多

qwb的博客 874

codeforces 567D One-Dimensional Battle Ships (set)

/* 题意: 在1~n的格子里,有k艘,每艘长为a的船,并且这些船不相交且不能相邻。 现在有m个射击,每个射击给你一个位置(1~n),并且不会重复。 由于对方每次都说没打中,因此你想找到至少要射击几次才能证明对方说谎。 若不能证明对方说谎,输出-1。 思路: n个格子,船长为a,则能放(n+1)/(a+1)艘船。(由于要求不能相邻,因此a+1)。 每次在set中插入射击点,二分上下界 原来可以放

苍竹林 627

CodeForces 567D One-Dimensional Battle Ships【二分】

Alice and Bob love playing one-dimensional battle ships. They play on the field in the form of a line consisting of n square cells (that is, on a1 × n table). At the beginning of the game Alice put

mengxiang000000 866

Codeforces 567D One-Dimensional Battle Ships

题目链接: http://codeforces.com/problemset/problem/567/D 解题思路: First, we should understand when the game ends. It will happen when on the n-sized board it will be impossible to place k ships of

piaocoder 1004

codeforces 567D One-Dimensional Battle Ships (map维护)

题意: 在1~n的格子里,有k艘,每艘长为a的船,并且这些船不相交且不能相邻。 现在有m个射击,每个射击给你一个位置(1~n),并且不会重复。 由于对方每次都说没打中,因此你想找到至少要射击几次才能证明对方说谎。 若不能证明对方说谎,输出-1。 思路: n个格子,船长为a,则能放(n+1)/(a+1)艘船。(由于要求不能相邻,因此a+1)。 使用map来维护。 map[i]:维护i

642

CodeForces - 567D One-Dimensional Battle Ships (二分)

题目链接:http://codeforces.com/problemset/problem/567/D点击打开链接 D. One-Dimensional Battle Ships time limit per test 1 second memory limit per test 256 megabytes input standard input

xuejye的博客 392

CodeForces - 567D One-Dimensional Battle Ships —— 二分思维

D. One-Dimensional Battle Ships time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Alice and Bob love playing o

Lngxling的博客 365

【CodeForces】567D - One-Dimensional Battle Ships & 【51Nod】1521 - 一维战舰(STL - set & 二分)

51Nod链接:点击打开链接 CodeForces链接:点击打开链接 1521 一维战舰 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 爱丽丝和鲍博喜欢玩一维战舰的游戏。他们在一行有n个方格的纸上玩这个游戏(也就是1×n的表格)。

wyg1997 669

Codeforces Round #Pi (Div. 2)567D One-Dimensional Battle Ships(set)

D. One-Dimensional Battle Ships time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Alice and Bob love playing o

GKHack's Blog 927
上一篇: Play a game (博弈论)
下一篇: Bellovin HDU - 5748 (最长上升子序列)
Guuuuuu老师儿
博客等级 码龄9年 259粉丝 718原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值