题目来源:小Hi小Ho的惊天大作战:扫雷·一

解题思路:因为只要确定了第一个是否有地雷就可以推算出后面是否有地雷(要么为0,要么为1,如果不是这两个值就说明这个方案行不通),如果两种可能中有一种成功,只需要计算包含有多少个1和多少个0,如果两种可能都成功了,都为1的才是有雷,都为0的才是没有地雷。

具体算法(java版,可以直接AC)

 import java.util.Scanner;

 public class Main {

     public static boolean flag1 = true;//当第一个为1(有雷)时,依次推算后的结果
public static boolean flag2 = true;//当第一个为0(没雷)时,依次推算后的结果 public static void solve(int[] maze, int[][] mine, int N) {
mine[0][1] = 1;//第一个有雷
mine[1][1] = 0;//第一个没雷 for (int i = 2; i <= N; i++) {
if (flag1) {
mine[0][i] = maze[i - 1] - mine[0][i - 1] - mine[0][i - 2];
//要么有雷,要么没雷
if (mine[0][i] == 1 || mine[0][i] == 0) {
flag1 = true;
} else {
flag1 = false;//推算失败
break;
}
}
} for (int i = 2; i <= N; i++) {
if (flag2) {
mine[1][i] = maze[i - 1] - mine[1][i - 1] - mine[1][i - 2];
if (mine[1][i] == 1 || mine[1][i] == 0) {
flag2 = true;
} else {
flag2 = false;
break;
}
}
}
if (flag1) {//验证最后一个是否正确
if (maze[N] != mine[0][N - 1] + mine[0][N]) {
flag1 = false;
}
}
if (flag2) {
if (maze[N] != mine[1][N - 1] + mine[1][N]) {
flag2 = false;
}
}
} public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int task = scanner.nextInt();
while (task > 0) {
task--;
int N = scanner.nextInt();
int[] maze = new int[N + 1];
int[][] mine = new int[2][N + 1];
for (int i = 1; i <= N; i++) {
maze[i] = scanner.nextInt();
}
flag1 = flag2 = true;
solve(maze, mine, N);
int hasMine = 0, noMine = 0;//统计有雷和没雷的数量
int[] hasMineAns = new int[N];
int[] noMineAns = new int[N];
if (flag1 && flag2) {//两种可能都成功
for (int i = 1; i <= N; i++) {
if (mine[0][i] == 1 && mine[1][i] == 1) {//同时为1(有雷)
hasMineAns[hasMine++] = i;
} else if (mine[0][i] == 0 && mine[1][i] == 0) {//同时为0(没雷)
noMineAns[noMine++] = i;
}
}
} else if (flag1 && !flag2) {//其中一种可能是成功的,另外一种失败
for(int i=1;i<=N;i++){
if(mine[0][i]==1){
hasMineAns[hasMine++] = i;
}else{
noMineAns[noMine++] = i;
}
}
} else if (!flag1 && flag2) {
for(int i=1;i<=N;i++){
if(mine[1][i]==1){
hasMineAns[hasMine++] = i;
}else{
noMineAns[noMine++] = i;
}
}
}
System.out.print(String.format("%d", hasMine));
for(int i=0;i<hasMine;i++){
System.out.print(String.format(" %d", hasMineAns[i]));
}
System.out.print(String.format("\n%d", noMine));
for(int i=0;i<noMine;i++){
System.out.print(String.format(" %d", noMineAns[i]));
}
System.out.println();
}
scanner.close();
}
}

hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告的更多相关文章

  1. hiho #1114 : 小Hi小Ho的惊天大作战:扫雷·一

    #1114 : 小Hi小Ho的惊天大作战:扫雷·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 故事背景:密室.监视器与充满危机的广场 “我们还是循序渐进,先来考虑这 ...

  2. hihoCoder#1114 小Hi小Ho的惊天大作战:扫雷·一

    原题地址 回溯+搜索 枚举每个位置上能否放地雷,当第i个位置枚举完成后,第i-1个位置的情况就确定了,此时,检查第i-1个位置是否满足要求,即左右间隔为1的范围内地雷数是否等于申明数字,如果满足条件, ...

  3. hihoCoder#1120 小Hi小Ho的惊天大作战:扫雷·三

    原题地址 看上去非常复杂, 实际上是这一系列最简单的一步,本质上是个搜索过程,相比于前一道题,可以不用策略三,而且题目的数据规模超级小,所以暴力搜索就能过. 把尚未确定的点放在一个unsettled列 ...

  4. hihoCoder#1119 小Hi小Ho的惊天大作战:扫雷·二

    原题地址 没有复杂算法,就是麻烦,写起来细节比较多,比较考验细心,一次AC好开心. 代码: #include <iostream> #include <vector> #inc ...

  5. hihoCoder 1062 最近公共祖先·一 最详细的解题报告

    题目来源:最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 题目描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其 ...

  6. hihoCoder 1037 数字三角形 最详细的解题报告

    题目来源:hihoCoder 1037 数字三角形 解题思路:请好好看看 提示一.提示二.提示三 具体算法(java版,可以直接AC) import java.util.Scanner; public ...

  7. hihoCoder 1050 树中的最长路 最详细的解题报告

    题目来源:树中的最长路 解题思路:枚举每一个点作为转折点t,求出以t为根节点的子树中的‘最长路’以及与‘最长路’不重合的‘次长路’,用这两条路的长度之和去更新答案,最终的答案就是这棵树的最长路长度.只 ...

  8. hihoCoder 1052 基因工程 最详细的解题报告

    题目来源:基因工程 解题思路:假设基因序列长度为N,则需要计算基因序列前K个和后K个相同所需要的最少改变次数sum. 假设基因序列为 ATACGTCT (即M=8),K=6:interval=M-K= ...

  9. hihoCoder 1051 补提交卡 最详细的解题报告

    题目来源:补提交卡 解题思路:假设未提交程序的天数为:a1,a2,....,an,补交的张数为M.依次从a1,a2,....,an中去掉连续的 K 天(0<=K<=M),然后再来计算剩余数 ...

随机推荐

  1. [CentOS 7]挂载ntfs格式U盘

    在我们将U盘插入装有CentOS的系统时,经常会出现如图所示的错误提示.这是因为linux系统并不能兼容NTFS的文件系统.其解决方法如下(建议先进入root模式): 1.首先下载"ntfs ...

  2. Head_First_Python(中文版)完整版PDF免费下载_百度云盘

    Head_First_Python(中文版)完整版PDF免费下载_百度云盘 提取码:bjbg 本书特色 根据认知科学和学习理论的最新研究成果,这本书采用一种适合大脑的丰富格式娓娓道来,而不是长篇累牍地 ...

  3. 手把手教你利用Docker+jenkins部署你的网站

    更新服务器的安装源为阿里的源,参考链接:https://blog.csdn.net/js_xh/article/details/79166655 安装docker; 1 更新资源 sudo apt-g ...

  4. .NETCore微服务探寻(三) - 分布式日志

    前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...

  5. 线程基础8-quene讲解

    PriorityBlockingQueue是一个基于优先级堆的无界的并发安全的优先级队列(FIFO),队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取 ...

  6. 一起玩转微服务(13)——AOP

    一.什么是AOP编程 AOP: Aspect Oriented Programming 面向切面编程. 面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP), ...

  7. 【总结】LINQ查询基本操作列表

    每个LINQ查询都以from子句开始,from子句包括以下两个功能. 指定查询将采用数据源. 定义一个本地变量,表示数据源中单个元素. string[] values = { "中国&quo ...

  8. 感知融合 awesome list

    感知融合 awesome list 雷达聚类 雷达处理杂波滤除 CFAR (Constant False Alarm Rate):Lee, Jae-Eun, et al. "Harmonic ...

  9. gitlab在k8s上运行的一些优化

    由 林坤创建,最终由 林坤修改于七月02,2020 gitlab组件图 gitlab在k8s上占用资源 kubectl top pods -n default | grep git* gitlab-g ...

  10. css3动画的性能优化_针对移动端卡顿问题

    这篇文章主要讲的是怎样制作流畅动画,特别是针对移动端.在这里我首先介绍制作动画的几种方法的优缺点:接着会着重介绍用css3制作动画的注意事项. 资源网站大全 https://55wd.com 设计导航 ...