hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告
题目来源:小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的惊天大作战:扫雷·一 最详细的解题报告的更多相关文章
- hiho #1114 : 小Hi小Ho的惊天大作战:扫雷·一
#1114 : 小Hi小Ho的惊天大作战:扫雷·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 故事背景:密室.监视器与充满危机的广场 “我们还是循序渐进,先来考虑这 ...
- hihoCoder#1114 小Hi小Ho的惊天大作战:扫雷·一
原题地址 回溯+搜索 枚举每个位置上能否放地雷,当第i个位置枚举完成后,第i-1个位置的情况就确定了,此时,检查第i-1个位置是否满足要求,即左右间隔为1的范围内地雷数是否等于申明数字,如果满足条件, ...
- hihoCoder#1120 小Hi小Ho的惊天大作战:扫雷·三
原题地址 看上去非常复杂, 实际上是这一系列最简单的一步,本质上是个搜索过程,相比于前一道题,可以不用策略三,而且题目的数据规模超级小,所以暴力搜索就能过. 把尚未确定的点放在一个unsettled列 ...
- hihoCoder#1119 小Hi小Ho的惊天大作战:扫雷·二
原题地址 没有复杂算法,就是麻烦,写起来细节比较多,比较考验细心,一次AC好开心. 代码: #include <iostream> #include <vector> #inc ...
- hihoCoder 1062 最近公共祖先·一 最详细的解题报告
题目来源:最近公共祖先·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 题目描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其 ...
- hihoCoder 1037 数字三角形 最详细的解题报告
题目来源:hihoCoder 1037 数字三角形 解题思路:请好好看看 提示一.提示二.提示三 具体算法(java版,可以直接AC) import java.util.Scanner; public ...
- hihoCoder 1050 树中的最长路 最详细的解题报告
题目来源:树中的最长路 解题思路:枚举每一个点作为转折点t,求出以t为根节点的子树中的‘最长路’以及与‘最长路’不重合的‘次长路’,用这两条路的长度之和去更新答案,最终的答案就是这棵树的最长路长度.只 ...
- hihoCoder 1052 基因工程 最详细的解题报告
题目来源:基因工程 解题思路:假设基因序列长度为N,则需要计算基因序列前K个和后K个相同所需要的最少改变次数sum. 假设基因序列为 ATACGTCT (即M=8),K=6:interval=M-K= ...
- hihoCoder 1051 补提交卡 最详细的解题报告
题目来源:补提交卡 解题思路:假设未提交程序的天数为:a1,a2,....,an,补交的张数为M.依次从a1,a2,....,an中去掉连续的 K 天(0<=K<=M),然后再来计算剩余数 ...
随机推荐
- Java 多线程基础(六)线程等待与唤醒
Java 多线程基础(六)线程等待与唤醒 遇到这样一个场景,当某线程里面的逻辑需要等待异步处理结果返回后才能继续执行.或者说想要把一个异步的操作封装成一个同步的过程.这里就用到了线程等待唤醒机制. 一 ...
- 手写简易版Promise
实现一个简易版 Promise 在完成符合 Promise/A+ 规范的代码之前,我们可以先来实现一个简易版 Promise,因为在面试中,如果你能实现出一个简易版的 Promise 基本可以过关了. ...
- 06.DRF-第一个demo
一.环境安装与配置 DRF需要以下依赖: Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6) Django (1.10, 1.11, 2.0) DRF是以Django扩展应用的 ...
- JVM源码分析之Object.wait/notify(All)完全解读
概述 本文其实一直都想写,因为各种原因一直拖着没写,直到开公众号的第一天,有朋友再次问到这个问题,这次让我静心下来准备写下这篇文章,本文有些东西是我自己的理解,比如为什么JDK一开始要这么设计,初衷是 ...
- jmeter正则提取器提取一个值或多个值
[安装Dummy插件] 这个插件可以模拟服务器返回,相当于一个mockserver了. 首先安装Dummy,选项--插件管理--可选插件--Dummy. [模拟响应] 添加线程组,在线程组下添加Dum ...
- docker安装mysql,设置mysql初始密码
docker安装mysql,只需要2分钟就可以完成 docker search mysql 拉取mysql镜像(https://hub.docker.com/_/mysql) docker pull ...
- 三文搞懂学会Docker容器技术(下)
接着上面一篇:三文搞懂学会Docker容器技术(上) 三文搞懂学会Docker容器技术(中) 7,Docker容器目录挂载 7.1 简介 容器目录挂载: 我们可以在创建容器的时候,将宿主机的目录与容器 ...
- Git报错信息
1. 解决办法: 当在最后提交的时候,出现的错误. 解决办法: git remote rm origin 执行下面代码: git remote add origin https://github.co ...
- Shader专题:卡通着色(一)控制颜色的艺术
什么是 Shader? 关于什么是 Shader ,各种百科各种教程都有说过,但是今天我们就从一个另一个角度去试着理解什么是 Shader? 我们先看下 Shade 的英文意思,如下: v.给...遮 ...
- [源码解析]Oozie来龙去脉之提交任务
[源码解析]Oozie来龙去脉之提交任务 0x00 摘要 Oozie是由Cloudera公司贡献给Apache的基于工作流引擎的开源框架,是Hadoop平台的开源的工作流调度引擎,用来管理Hadoop ...