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~: 其实这段代码是想告诉你一件事:用序列中的大数减去小数 ...
随机推荐
- (十八)SpringBoot之发送QQ邮件
一.引入maven依赖 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...
- 巧用Ajax的beforeSend 提高用户体验--防止重复数据
巧用Ajax的beforeSend 提高用户体验 jQuery是经常使用的一个开源js框架,其中的$.ajax请求中有一个beforeSend方法,用于在向服务器发送请求前执行一些动作.具体可参考jQ ...
- pickle 和 base64 模块的使用
pickle pickle模块是python的标准模块,提供了对于python数据的序列化操作,可以将数据转换为bytes类型,其序列化速度比json模块要高. pickle.dumps() 将pyt ...
- Uploadify 之使用
uploadify 3.2.1是 jQuery提供的一个上传插件,其参数详解见 http://www.cnblogs.com/yangy608/p/3915349.html 这里列举一个实际应用的例子 ...
- SourceTree撤销commit
参考链接:http://blog.csdn.net/gang544043963/article/details/71511958 重点是:选中提交之前的版本,再进行撤销回退
- bootstrap 模态框在iphone微信内点击无效
<a data-toggle="modal" data-target="#wwww" href="" οnclick=" ...
- DNSMaper 一款子域名枚举与地图标记工具
DNSMaper DNSMaper拥有与众多子域名枚举工具相似的功能,诸如域传送漏洞检测,子域名枚举,IP地址获取 文件说明├── dnsmaper.py(核心代码)├── dnsmapper.png ...
- Computer Vision_18_Image Stitching: Image Alignment and Stitching A Tutorial——2006(book)
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...
- jade-render-renderFile
var http = require('http'); var jade = require('jade'); http.createServer(function(req, res){ res.wr ...
- 解压gz文件有误
tar: This does not look like a tar archive tar: Skipping to next header tar: Exiting with failure st ...