洛谷 P2688 大海战(二分+DP)

本文介绍了洛谷P2688题目的背景和描述,涉及一个1*n棋盘上放置战舰的游戏。文章详细解析了如何在不同攻击次数下判断玩家是否撒谎的算法,包括初始布局检查、单次攻击的01背包优化、单种战舰的二分查找以及两种战舰的动态规划方法。文章提供了多种情况的解决方案,并给出了样例测试用例及其结果。
摘要由CSDN通过智能技术生成

题目背景

一天,GD和MW正在玩一款名叫大海战的游戏。

题目描述

游戏在一个1*n的棋盘上进行。一开始GD拥有c种战舰,每种战舰的宽度为1,长度为ci,共有ti个。GD要将所有这些战舰放置在棋盘上,并且任意两艘战舰间不能重叠(但可以相邻)。接下来,MW进行q次“攻击”,每次攻击一个1*1的格子,而MW将告知他这次攻击是否“打中”了一艘战舰(或者它的某个部分)。令人疑惑的是,每次MW都告诉GD说他没有打中任何一艘战舰,而这显然是不现实的。现在MW把整个游戏的过程告诉了你,他想知道,最早在他的第几次询问之后,可以断定GD一定(至少有一次)说了谎。

输入输出格式

输入格式:
第一行一个整数t,表示测试数据的组数。对于每组数据,第一行三个整数n,c,q,代表棋盘的长度、战舰的种数和攻击的次数。接下来c行,每行两个整数ci、ti,表示第i种战舰的长度和数量。(不同的战舰,长度可能相同。)接下来一行q个整数,表示MW的攻击序列。

输出格式:
对于每组数据,输出一个整数ans,表示最早在第ans次操作后可以断定GD说了谎。特别地,如果一开始就不可能按要求摆上所有的战舰,输出0;如果q次询问后都不能判断GD是否说了谎,则输出-1。

输入输出样例

输入样例#1:
3
12 2 2
1 1
2 5
6 8
5 1 2
3 1
1 5
11 3 0
2 2
3 1
5 1
输出样例#1:
2
-1
0
说明

样例解释

对于第一个样例,存在布阵{1,22,22,0,22,22,22}(0表示没有放置),使得第一次不会受到攻击;不存在一个布阵使得两次都没有受到攻击。

对于第二个样例,存在布阵{0,333,0},使得两次均不会受到攻击。

对于第三个样例,一开始就不可能把所有战舰合法地布置在棋盘上。

数据范围

对于100%的数据,1<=t<=5,n>=1,c>=1,q>=0,1<=qi<=n,0<=ci<=100000,0<=ti<=100000。

对于测试点1,n<=1000000000,c<=100000,q=0;

对于测试点2、3,所有的ti均为1;

对于测试点2-8,n<=400000,c<=100,q=1;

对于测试点9,n<=100,c=1,q<=100;

对于测试点10-14,n<=200000,c=1,q<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值