2019.7.9 校内测试 T1挖地雷
这一次是交流测试?边交流边测试(滑稽
挖地雷
这个题是一个递推问题。
首先我们看第一个格子,因为它只影响了它的上面和右上面这两个地方是否有雷。
我们可以分3种情况讨论:
1. 第一个格子的数字是2;
2. 第一个格子的数字是1;
3. 第一个格子的数字是0;
显然对于第1种情况和第3种情况,我们可以确定前两个空的埋雷情况:
第1种情况就是前两个空都埋雷了,第3种情况就是钱两个空都没有埋雷;
第二种情况我们需要再往下细分:第一个空埋雷,第二个空不埋雷;第一个空不埋雷,第二个空埋雷;
我们根据样例来分析递推情况:
首先根据第一个格子的数字是2,我们可以推断出前两个空肯定是有雷的:
接下来我们考虑第二个格子上的数字对埋雷情况造成的影响,考虑到我们在考虑第 i 个格子上的数字时,第 1~i 个空已经确定下来了(是否埋雷),所以对于第2个格子及以后,它真正能确定的空也就是第 i + 1 个,根据样例可知,第三个空是不埋雷的:
接下来考虑第三个格子上的数字对埋雷情况造成的影响,前三个空已经确定了,所以只能确定第四个空的情况,根据样例可知,第四个空是埋雷的:
以此类推,当我们考虑第 i 个格子上的数字对答案造成的影响的时候,实际上只能确定第 i + 1 个空的情况,对于具体的是否埋雷,我们还要看第 i - 1 ,i 个空的埋雷情况与第 i 个格子的数字的关系,轻松得到如下关系:
我们设 tot 是第 i - 1 ~ i 个空埋了多少个雷,vis [ i ] 表示第 i 个空是否埋雷,a [ i ] 表示第 i 个格子的数字是多少,则 tot 可以用下面一段代码求出:
for(int i=k-;i<=k;i++) //当前考虑第k个格子上的数字对答案的影响
if(vis[i]) tot++;
有了这个 tot 有什么用呢?它决定着第 i + 1 个空是否埋雷,特别的,还能判断是否有解!
若 a [ k ] - tot = 1,说明第 i + 1个空需要埋雷;
若 a [ k ] - tot = 0,说明第 i + 1个空不需要埋雷;
若 a [ k ] - tot >=2,说明无解; //一个格子最多放一个雷,你却还有两个以上的雷需要放,肯定无解
若 a [ k ] - tot < 0;说明无解; //明明只需要放 a [ k ] 个,你光前两个空放的都比 a [ k ] 多了,肯定无解
说句题外话,第四个关系式我当时没想到,然后就 65 了QwQ~
代码也很好写,就是这样的(其实就是套上去的):
if(a[k]-tot==) vis[k+]=;
if(a[k]-tot==) vis[k+]=;
if(a[k]-tot>=) return ; //一个格子最多放一个雷,你却还有两个以上的雷需要放,肯定无解
if(a[k]-tot<) return ; //明明只需要放a[k]个,你光前两个空放的都比a[k]多了,肯定无解
search(k+); //找下一个格子
还有一个小细节需要考虑到:
我们前面已经说了第 i 个格子的数字的实际影响是第 i + 1个空,所以说我们遍历第 n - 1个格子的时候不就把雷给埋完了?那第 n 个格子有啥子用?
这里我就用第 n 个格子的数字再来判断一下我们的埋雷情况是否合法,当我们遍历到第 n 个格子时,我们需要看一下 vis [ n - 1 ] + vis [ n ] 是否等于 a [ n ] 即可。
So ,我们就可以上完整代码啦:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,bj,tot;
int a[],vis[];
void search(int k)
{
tot=; //在k对应的三个格子中,已经埋了多少雷
for(int i=k-;i<=k;i++)
if(vis[i]) tot++; //求tot
if(k==n) //当我们遍历第n个格子,进一步判断是否合法
{
if(a[n]==tot) bj=; //如果等于,说明合法
return ;
}
if(a[k]-tot==) vis[k+]=;
if(a[k]-tot==) vis[k+]=;
if(a[k]-tot>=) return ; //一个格子最多放一个雷,你却还有两个以上的雷需要放,肯定无解
if(a[k]-tot<) return ; //明明只需要放a[k]个,你光前两个空放的都比a[k]多了,肯定无解
search(k+); //找下一个格子
}
int main()
{
//freopen("bomp.in","r",stdin);
//freopen("bomp.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]<||a[i]>) //这里好坑的,一定要特判一下
{
cout<<"No answer"<<endl;
return ;
}
}
if(a[]==) //分情况讨论
{
vis[]=;
vis[]=;
search();
}
if(a[]==) search();
if(a[]==) //细分埋一个雷的情况
{
vis[]=; //先使第一个空埋雷
search();
if(!bj) //没找到解再让第二个空埋雷
{
memset(vis,,sizeof(vis));
vis[]=;
search();
}
}
if(bj)
{
for(int i=;i<=n;i++)
cout<<vis[i]<<" ";
}
else cout<<"No answer"<<endl;
return ;
}
2019.7.9 校内测试 T1挖地雷的更多相关文章
- 2019.6.28 校内测试 T1 Jelly的难题1
这题面有点难理解,建议直接跳到题意解释那一部分(虽然我觉得解释的不大对,但按照解释来做确实能AC): 按照“题意解释”的思路来思考这个题,那么就十分的简单了: 1.首先要读入这个字符矩阵,可以用cin ...
- 2019.7.9 校内测试 T3 15数码问题
这一次是交流测试?边交流边测试(滑稽 15数码问题 大家应该都玩过这个15数码的游戏吧,就在桌面小具库那里面哦. 一看到这个题就知道要GG,本着能骗点分的原则输出了 t 个无解,本来以为要爆零,没想到 ...
- 2019.7.9 校内测试 T2 极值问题
这一次是交流测试?边交流边测试(滑稽 极值问题 乍一看这是一道数学题,因为1e9的数据让我暴力的心退却. 数学又不好,不会化简式子嘞,咋办? 不怕,咱会打表找规律.(考场上真的是打表找出了规律,打表打 ...
- 2019.6.24 校内测试 NOIP模拟 Day 2 分析+题解
看到Day 2的题真的想打死zay了,忒难了QwQ~ T1 江城唱晚 这明显是个求方案数的计数问题,一般的套路是DP和组合数学. 正如题目中所说,这个题是一个 math 题. ----zay ...
- 2019.6.20 校内测试 NOIP模拟 Day 1 分析+题解
这次是zay神仙给我们出的NOIP模拟题,不得不说好难啊QwQ,又倒数了~ T1 大美江湖 这个题是一个简单的模拟题. ----zay 唯一的坑点就是打怪的时候计算向上取整时,如果用ceil函数一 ...
- 18清明校内测试T1
消失的数字(number) Time Limit:1000ms Memory Limit:128MB 题目描述 rsy拥有n个数,这n个数分别是a1,a2,…,an. 后来出现了一个熊孩子zhw, ...
- 2019.6.28 校内测试 T4 【音乐会】达拉崩吧·上
考试的一道附加题~ 一看题目描述:把区间[l,r]里每个数异或上x,求区间[l,r]里所有数的异或和,这明显的要用数据结构或RMQ吧. 恩,所以正解就是线段树啦,至于树状数组行与否,不知道~ wate ...
- 2019.6.28 校内测试 T3 【音乐会】道路千万条
大眼一看最下面的题意解释的话,发现这和洛谷P1310表达式的值挺像的,大概都是给定一些运算符号,让最后的表达式为true的概率,为false的概率啥的QwQ~: 然后这个题嘛?就是在所有的运算符中提溜 ...
- 2019.6.28 校内测试 T2 【音乐会】二重变革
看到这个题之后,一个很暴力很直接的想法就是贴上题目中的代码然后交上去走人,但是很显然这是会TLE+MLE的,想想谁会这么傻把主要代码给你QwQ~: 其实这段代码是想告诉你一件事:用序列中的大数减去小数 ...
随机推荐
- (九)springmvc之json的处理(服务端发送json数据到客户端)
一.json处理方法有两种 1:导入Spring需要json的jar包.(本例使用) 使用@ResponseBody该注解用于将Controller的方法返回的对象,通过HttpMessageConv ...
- 使用swagger在netcorewebapi项目中自动生成文档
一.背景 随着前后端分离模式大行其道,我们需要将后端接口撰写成文档提供给前端,前端可以查看我们的接口,并测试,提高我们的开发效率,减少无效的沟通.在此情况下,通过代码自动生成文档,这种需求应运而生,s ...
- [NOIP2018模拟赛10.23]发呆报告
闲扯 考场看了眼题目感觉很难,一个小时敲完了所有暴力...嗯然后就在那里发呆什么事也没做 T3考场上把数据结构想了个遍都不会完成1操作,现在看这种思路其实之前也接触过... 比较玄学的一件事情就是T1 ...
- VisualSVN 关于权限(第1篇)
总结权限的规则: 1.子目录权限完全覆盖父目录权限.以子目录的权限为最终.仓库本身就是祖宗,所有的子目录继承他的权限,所有仓库本身必须增加可访问权限,要么everyone ,要么增加全部团队成员. 2 ...
- js原生方法的重写
讲干货,不啰嗦,通过prototype可以获取到JavaScript的原型对象,进而可以在对象原型上添加新的属性和方法,当该方法与原方法名称一样时会覆盖原方法既:重写,当不一样时既:添加 如:实现数组 ...
- 2 webpack 4 加vue搭建开发环境最终配置
1 package.json { "name": "c", "version": "1.0.0", "desc ...
- Go 缓冲信道
缓冲信道 语法结构:cap为容量 ch := make(chan type, cap) 缓冲信道支持len()和cap(). 只能向缓冲信道发送容量以内的数据. 只能接收缓冲信道长度以内的数据. 缓冲 ...
- Ubuntu安装telnet
安装 # sudo apt-get install xinetd telnetd 配置 -> 加入以下选项 # sudo vi /etc/inetd.conf telnet stream tcp ...
- mysql打印用户权限的小技巧
mysql5.5 5.6 SHOW GRANTS FOR mysql> SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host ...
- UMI.js开发知识总结
五分钟掌握最小知识体系 本文阅读时间大概为5分钟,但是能让你了解基于UMI和DVA构建项目的最小知识体系,你可以粗略的浏览一下本文所提到的知识,在后续的讲解中都会多次重复提起,保证学习效率.由于现在前 ...