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~: 其实这段代码是想告诉你一件事:用序列中的大数减去小数 ...
随机推荐
- (三)Lucene之删除更新文档以及luke的基本使用
一.demo 本例中采用单元测试,故在pom.xml中引入junit jar包 1.1 前提: public class IndexTest { /** *数据准备 */ private String ...
- (一)Lucene简介以及索引demo
一.百度百科 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查 ...
- JDBC 学习复习6 学习与编写数据库连接池
之前的工具类DBUtil暴露的问题 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的 ...
- TCP的三次握手与四次挥手笔记
TCP的三次握手与四次挥手笔记 TCP Flags URG: 紧急指针标志 ACK:确认序号标志 PSH:push标志 RST:重置连接标志 SYN:同步序号,用于建立连接过程 FIN: finish ...
- Css制作table细线表格
制作细线表格,我想应该是最基本的css知识了,记录下来巩固下. 推荐: table{ border-collapse:collapse; border: 1px solid #000000; } td ...
- mimikatz记录
mimikatz需要管理员权限运行 vps监听 nc -lvp 4444 服务器管理员权限执行 mimikatz.exe ""privilege::debug"" ...
- 【已解决】项目加载失败,Web应用程序项目XX已配置为使用IIS
这个解决方法是我在网上参考了很多方法都不行,因为昨天还好好的,今天就不行,那跟项目没多大关系,跟环境有关. 解决方案: 本地iis和vs自带的iis冲突了,默认用了本地的iis,我删掉本地的就可以了. ...
- EditText编辑框
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- HTML5 canvas 在线涂鸦
插件地址 http://bencentra.github.io/jq-signature/ 采用技术 jq-signature.min.js Developed using jQuery 2.1.4. ...
- log:日志处理模块
为了更好的跟踪程序,我们通常都会使用日志,当然在golang中也提供了相应的模块. 基本使用 可以直接通过log来调用格式化输出的方法. package main import "log&q ...