关于在实验室的模拟训练
实验室第一次作业,不算很难,但模拟确实很考验细节和耐心。。

这是我会写的题目
J和K是最难的两道题
上传下我自己的题解吧!
模拟专题
A. Suffix Three
先来看题意:给定一个字符串,结尾是"po"的被称为Filipino语,"结尾desu"或者"masu"的被称为Japanese语,结尾是"mnida"的被称为Korean语 (不知真假)
好吧其实大家都看到了,这就是一道签到题,只需要判断字符串尾部就好了,或者说更直接一点看最后一个字母是什么就好了
如果是'a'结尾的是Korean语,'o'结尾的是Filipino语,'u'结尾的是Japanese语。
所以我们就直接上代码吧!
B. Dreamoon and Ranking Collection
先看题意吧:有个人在cf打比赛的排位为a1,a2....an序列,问在又进行x轮比赛后这个人的cf打过的比赛中排位最多从1连续到多少。换句话说,可以找到x个数插在a1到an序列后,找到最大v使得,1-v都在序列当中
很显然这也是道签到模拟题(看通过率还挺高的)
简单阐明下思路
本题数据量很小,所以我们直接暴力遍历即可,我们需要看从1一直往后有多少数需要补充,依次补充即可。在遍历之前,我们先定义一个f数记录是否需要补充。随后我们考虑有以下两种可能:
-
v < 最大的数
-
v >= 最大的数
为了能搞清楚v能不能大于最大的数,我们就先找到最大的数,然后从1开始遍历看看能不能大于等于n
(前面读取数据略过)
我们先定义变量cnt表明已经填充了多少数了
int cnt = 0;
然后就从1到最大的数开始遍历(这里我们假定maxn是最大的数)
for(i=1;i<=maxn;i++)
{
if(!f[i])
{
if(cnt<x) //如果还能够补充
cnt++;
else break; //不能补充了就退出,此时i就表示 v+1
}
}
最后我们根据情况分类讨论输出就行了。
if(i==maxn+1)//遍历结束了,v >= maxn
printf("%d",maxn+x-cnt);
else printf("%d",i-1); //v < n 直接输出 i-1
printf("\n");
下面附上本蒟蒻代码:
C. Symmetric Matrix
symmetric是“对称的”意思,相信聪明的你肯定知道的
先看题意: 有无数个给定的2×2正方形,问你是否能根据这些矩形构造出一个给定m × m的对称正方形。一个对称正方形的定义是这样的:s[ i ] [ j ] = s[ j ] [ i ]
思路:
其实这道题看起来很难实际上很简单,因为它没有要求我们用上每一个,所以只要有一个满足,我们就可以将这个正方形拼上去拼成我们想要的这个正方形(当然也有可能拼不上,我们待会儿再讲)
那么问题来了,到底什么样的正方形才能算是满足的呢?
这个解释起来有点困难,我们可以画图看下
首先我们考虑4 × 4的正方形(这图一定画得很好)

当 i = j 的时候肯定是相等的

否则,我们只需要满足拿出来构造的正方形的另一条对角线的数相等就行了,其余情况都是可以根据构造的三角形自身对称来做到

这是 4×4的正方形,那么我们再考虑n × n呢?
我们会发现可以把n × n分解成四块

同样可以一直细分下去(时间关系图就不补充完了),最后我们只要构造的小正方形满足,整个大正方形就可以满足了。
好此题结束
还有一种可能,2×2的正方形不能构造出m×m的正方形,也就是说,m为奇数是,是不可能构造出来的。所以我们还需要判断下m的奇偶性即可。
话不多说,上代码:
D. Happy Birthday, Polycarp!
先看题意:漂亮数是指数位中只有一个数的数。给定一个n,求1到n(包括n)有多少个漂亮数。
我乍一眼,以为是数位dp
好的吧,其实思路是这样的:
首先我们考虑若n是一位数,由于小于10的数都是漂亮数,所以就有1,2,····,n共n个漂亮数
其次,我们再看万一n有两位数以上
我们拿494564举例,这个数有六位数,所以所有五位数以及以下的漂亮数都可以,我们从相同的数字入手,由于第一位不能是0,所以相同的数字可以是1到9,设这个数有cnt位,则在100000以前的漂亮数有(cnt - 1)* 9个,我们现在只需要考虑从100000到494564有多少个漂亮数。我们要从头考虑,当首位是1,2,3时都是可以的(因为111111 222222 333333 首位都小于4,所以后面无论多大都没用)
所以,现在我们的难点是考虑相同数字为最高位且位数与这个数一样多的数字行不行。换句话说:设最高位为m,位数为q,我们需要考虑mm····mm(总共有q个m)的数是否大于n就行了。
理清了思路,我们就可以看看代码怎么写的了:
