随笔分类 - 模拟题
易错
摘要:题意:给定一个九宫格,然后能够选择某行或者是某列滚动,每个小方格分为上下左右四个块,每个块可以涂上4种不同的颜色。问最少使用多少步能够使得所有相同颜色相互联通。分析:由于九宫格的所有的状态只有9!(362880)种,于是想起了先对每个格子进行标号,然后根据逆序对的数量进行一个递增进制数的hash处理,这样bfs搜索就能够去重了,接着只需要判断每个状态是否满足联通即可。这里的判定选择了先统计了不同颜色格子的数量然后dfs搜索,应该并查集也可以搞。滚动使用指针滚动即可,对于不能动的格子该格子所在行和列都不能够滚动。#include #include #include #include #inclu
阅读全文
摘要:题意:链接分析:每一个D或者是E点往四面延伸,并且赋一个特殊的值,能看到D点的点赋值为1,能看到E点的点赋值为1000,这是因为最多100步,因此最后可以根据除以1000和对1000取模来得出某个状态的值,那么这个数值对应的状态就有四种,BFS搜索即可。之前没有考虑到折回这种情况,原因就是状态没有进行完全的搜索。后面看了网上的写法中多是直接开设了四维的一个状态,只需记录某状态走还是没走,也就没有这种折回的考虑了。#include #include #include #include #include #include using namespace std;const int N = 105;
阅读全文
摘要:题意:就是平时玩的十滴水游戏,游戏者拥有一定的水滴,能够滴在某些位置,如果一个点上的体积超过了4就会爆炸,向四周传递一个小水滴。该题就是要求模拟这个过程。分析:这里有一个问题就是不能够使用递归来处理这个过程,因为水滴拥有速度,如果是递归调用的话,那么可能本来应该同时到达某点的水滴变成不同时间到达了。处理该题使用了两个队列,分别模拟当前时刻,和下一时刻,每次从当前时刻取出所有的水滴,再视情况处理加入到下一时刻的队列中。有个地方要注意就是同时到达某一点的水滴加上原来的水滴超过了5那么视作和5等效。#include #include #include #include #include #inclu
阅读全文
摘要:题意:给定了一个塔防的游戏模型,跟着这个模型进行模拟,输出能在多少时间内消灭掉所有的怪兽,如果不能的话,输出-1。解法:这里提几个要注意的地方:1.注意怪兽不要走回头路;2.注意已死的怪兽不能够再次成为防御塔选择或者是移动的对象;3.所有防御塔是同时攻击的,因此选择型的防御塔不能够预判出该秒攻击是否多余,即最优目标是绝对的,不会因为其他塔能够射杀死中途改变;4.要注意最后全部怪兽被持续冻结而不掉血的情况。题目中可能没有把这个游戏的过程说的特别详细,对于每一秒钟是如下度过的:在一秒钟开始的时候(S)所有的怪兽全部获得一秒钟更新时间:如果怪兽被冻结,那么这一秒钟用于解冻,无法移动;否则使用一秒钟向
阅读全文
摘要:题意:给定一些歌词,歌词是一行一行给定的,要出输出出现次数大于2的所有单词,次数一样多的单词归为一组,每组输出长度最长的,否则输出字典序倒数第二的单词。解法:这题单词的定义实在是模糊,正确做法是把所有的非字母变为空格后再处理。使用map统计单词数量,然后用数组取出来排个序即可。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <cctype>#include &l
阅读全文
摘要:题意:有一个判定用户等级的系统,现在不同的等级有不同的评价标准,现给定一个用户的历史等级以及当前最新的数据,要求给出目前的等级。解法:把不同的等级标题映射到数字,然后或者历史等级的标号,然后从大的往当前标号枚举,查看是否升级,如果升级则推出判定;否则从当前等级往小的标号枚举,查看是否降级,查看降级时只需要判定比率是否小于一个阀值即可,因为其他满足历史等级的条件一定满足标号比它小的等级,遇到不降级即退出判定。由于Peasant的判定于其他不太一样,在开始的时候就判定一下。代码如下:#include <cstdlib>#include <cstdio>#include &l
阅读全文
摘要:题意:给定一系列的数码管,这些数码管由3*3的图形构成,相邻的两个数码管紧挨着的一列是重叠的,现在问一共有多少种可能的情况。解法:将每个数字的可能的显示结果(能亮的地方假设都可以亮)保留起来,然后一个一个数码枚举,一个地方要注意就是相邻意味前面一个数码占用了某一个亮线,那么后面这个数码可以选择是否占用该亮线,而如果前面没用占用该亮线则后面的数码必须占用。使用f[i][j]表示到第i个字符,占用相邻列情况为j时的方案数。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <
阅读全文
摘要:题意:给定一个字符串,按照要求输出来。解法:每次进行一次首字母判定,然后根据不同的情况进行递归。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <string>#include <iostream>#include <algorithm>using namespace std;char str[300];string display(int ti, int sta, int fuck) { string ret; if (sta >
阅读全文
摘要:题意:有N个国家,每个国家属于一个洲,现在有人要来攻击一些国家,每次攻击选择来自三个不同洲的国家,我们能够选择去保护一个国家,被保护的国家恐惧值-2,其余两个国家恐惧值+2,和这两个国家在一个洲的国家恐惧值+1。分析:由于超过5点恐惧值就以及超过极限了,而每次攻击又会带来其余两个洲恐惧值的增加,因此最多在不超过10天的情况下将会出现有国家超过5点恐惧值。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <algorith
阅读全文
摘要:题意:给定一个多项式,对其进行因式分解。解法:由于多项式每一项系数绝对值不超过1000,由于最后解的形式为(x-a)(x-b)(x-c)(x-d)(x-e)其中a*b*c*d*e一定是最后的常数项系数,因此a, b, c, d, e的取值范围都在[-1000, 1000]内,因此枚举所有的根,剩下的就是重根的时候该怎么办?一个解决办法就是对原多项式进行求导,如果一个根t是f(x)的K重根的话,那么t一定是f(x)'的K-1重根。该题的字符串处理我没写好,后面调了很久。还有就是由于有5次方存在,因此代入时使用long long计算。代码如下:#include <cstdlib>
阅读全文
摘要:题意:告诉某一天,然后往前和后各推一定天数,输出计算之后的日期。解法:一天一天模拟,日期的在各个位的进制不尽相同。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int month[13] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};bool leap(int y) { return (y%4==0 && y%100!=
阅读全文
摘要:题意:介绍一种控制台下的文件目录输出格式,要求进行模拟.详见代码代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <stack>#include <string>#include <vector>#include <algorithm>using namespace std;/* 目测应该要抽象出文件和目录这两个结构 对于文件我们可以有一个很清醒的认识,也就是说所 有的文件总是离
阅读全文
摘要:题意:一言难尽,就不说了.解法:我们只要把握好要保留哪些状态以及每天会有哪些动作要进行更新就可以了.该题的话,我们只需要保留:A.每天有多少克隆士兵存活在命题者所设定的世界里面,当然每个士兵都有一个生存天数的属性.B.每天有多少士兵正在培养,每个培养体当然有一个已经培养的天数属性.然后我们就要定义一些动作出来,从培养体变成士兵,已经获得材料.代码如下:#include <cstdio>#include <cstring>#include <cstdlib>using namespace std;int N, D, A, K, X;// 保留两个信息,即当天克
阅读全文
摘要:每次计算出当前点与第一个点的距离即可。代码如下;#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>#include<vector>#include<string>#include<math.h>#include<map>#include<set>#include<algorithm>#define MAXN 100000using namespace std;int N, M, cur
阅读全文
摘要:相当于表达式计算一般,用递归进行处理,将BEGIN视作是一个LOOP,每次进入LOOP则进行多条语句处理,知道遇到END位置,结束这个LOOP。代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <map>#include <queue>#include <v
阅读全文
摘要:LightningLessonsTime Limit:5000ms,Special Time Limit:12500ms,Memory Limit:32768KBTotal submit users:8,Accepted users:8Problem 12545 :No special judgementProblem descriptionZeus wrung his hands nervously. “I’ve come to you because I agreed to duel Thor in the upcoming Godfest. You’re good in a fight,
阅读全文
摘要:这题只需要预处理两个数组就可以了,那就是一个保留从1到N,这个N个数字连在一起的长度,以及另外一个数组表示重复打印112123...123..N的这样一个打印到N的串的长度。接下来进行两次二分查找便可得到答案了。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#define MAXN 32000using namespace std;typedef long long int Int64;Int64 N, c[MAXN+5], s[MAXN+5];inline int Len(int x){
阅读全文
摘要:Description某校数据结构课程设计期末考核即将来临。为了考查学生对树结构的认识,同时也检验学生的编程能力,该校将考核的一项内容定为:要求编写程序按编号顺序打印出节点个数不少于m的所有二叉树。编号规则:·仅有一个节点的树编号为1。·当满足以下条件之一时,定义二叉树a的编号比b大:1.a的节点数比b多。2.若a的节点数与b相等,且a的左子树编号比b的左子树大。3.a的节点数和左子树编号都和b相等,且a的右子树编号比b的右子树大。二叉树的节点用大写X表示,例如:当然当m较大时,检验答案对错的工作也是很繁重的,所以教师只打算对其中的若干个编号的二叉树进行抽查,请编制一个程序
阅读全文
摘要:这个题在于唯一确定好色子的状态,其实只要知道了色子的前上右分别的点数,也就唯一确定了色子的状态,我们可以根据这三个状态来恢复整个色子的六个面的情况。这题还要注意对4进行取模(由于本身已经占了一个格子,因此要减1),直接模拟的话很有可能超时,利用switch的贯穿性质可以让我们的代码过程更加舒适。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int N, M, ti;long long int sum
阅读全文
摘要:算出每个窗户左上角和右下角的坐标,直接模拟就行了。这题直接把sum放在G数组后面,导致sum变成了char型,错了一次,G数组第一次只开了105~~~。代码如下:#include <cstring>#include <cstdio>#include <cstdlib>using namespace std;char G[600][600];int sum[10];int main(){ int N, M, x1, y1, x2, y2, cnt; while (scanf("%d %d", &N, &M) == 2) {
阅读全文