中国计量大学计算机编程,【题解】第三届中国计量大学程序设计竞赛(个人赛)...

题解不是我写的,帮忙发帖~~

第三届中国计量大学程序设计竞赛(个人赛)

A.Arithmetic Problems

本题主要考察基本的编程技巧和字符串处理能力

但是从答题情况来看,虽然本题有一些陷阱,但整体做题情况不是特别理想

表达式计算问题历来都是编程的经典问题,有直接模拟,递归模拟,堆栈模拟等多种做法;事实上在本题中理论上均可行,但需要注意的是,应如何处理本题中带空格的字符串,才能确保传统的方法不会出错。

下面仅提供两种思路:

1.先用getline把带空格的字符串读进来,然后构造一个空串,然后把空格去掉

2.逐个字符读入,如果读到空格,则继续读下一个字符,读到有用的信息则进行对应的计算,读到回车结束

B.Birthday Gift

我们可以通过固定a,b的相对位置来通过线性复杂度解决这个问题。我们让

equation?tex=min(x_%7Ba%7D%2By_%7Bb%7D%2Cx_%7Bb%7D%2By_%7Ba%7D)%20%5Cequiv%20x_%7Ba%7D%2By_%7Bb%7D&preview=true,这样就有

equation?tex=x_%7Ba%7D%2By_%7Bb%7D%20%5Cleq%20x_%7Bb%7D%20%2B%20y_%7Ba%7D&preview=true,即

equation?tex=x_%7Ba%7D-y_%7Ba%7D%5Cleq%20x_%7Bb%7D-y_%7Bb%7D&preview=true,然后我们通过这个规则进行排序以后,就发现对于每个位置a,它的贡献度为

equation?tex=x_%7Ba%7D&preview=true,我们只要在[a+1,n]找最大的

equation?tex=y_%7Bb%7D&preview=true,然后用

equation?tex=x_%7Ba%7D%2By_%7Bb%7D&preview=true更新答案即可,这个找最大的

equation?tex=y_b&preview=true只需要维护序列的后缀最大值就可实现

复杂度

equation?tex=O(n)&preview=true

C.Pinch Pinch Pinch

由题意可推得一个碎片n可以再次被分解的条件为存在一个i(i的含义为将碎片n分成i块)满足

equation?tex=i(i%2B1)%2F2%2Bi%20%5Ctimes%20base%20%3D%20n&preview=true,分解后碎片大小为base+1,base+2,······,base+i,依次查询这些碎片的分解次数,返回累加和加上这次分解(1),每次大小至少处以2,考虑使用dfs,并记录每次查询过的值避免重复查询。再由于题目中说到每次分解成尽可能多的块,所以i从上界sqrt(2n+1)+1开始往下依次确认是否可以分解。

D.Stay up Late and Wake up Early 首先,考虑本题的极端情况,闹钟的再响时间为2分钟,但给定时间是16:58或者6:58,也就意味着只有在小时出现幸运数字‘7’的时候,循环查找才能停止,此时循环次数不大,完全可以暴力求解。然后分情况讨论,一种是枚举过程中遇到分钟数包含幸运数字‘7’,另一种是直到计算到第一次出现7时或者17时的情况为止即可。

E.No Breakfast for College Students

首先要知道,我们在到达时间和离开时间的确定上减少一两顿饭,然后我们知道除了到达和离开,其他每天都要补全三顿,这就意味着完整情况下,三个数字间的差距应该不大于1.而又因为三顿饭可以看成环状,早饭和午饭相邻,午饭和晚饭相邻,所以我们只需要找到三个数字中的最大值,然后将其他两个数字补全到大于等于最大值减1的数值即可构成完整三餐。

F.Robotics innovation Lab

乍一想很容易,将左右上下能达到的最远距离记录下来,计算长度len和宽度wei,考虑ans = len

equation?tex=%5Ctimes&preview=true wei的值,当len大时,使wei减1则ans减得更多,反之则使len减1.但还有条件限制是否能减,因为假设在抵达左最大值前右移一格固然能减小左最大值,但是可能会增大之后抵达的右最大值,所以需要记录第一次抵达和最后一次抵达最大值的时间,以此来判断能否减1.

G1.Mathematical Modelling Class

本题是一道经典的分组分配问题,首先根据大家的选择意向,可以分成({0,0},{0,1},{1,0},{1,1})四类同学,然后划分参加数学建模提高班的所有同学为

equation?tex=n_%7B1%7D%2Cn_%7B2%7D%2Cn_%7B3%7D%2Cn_%7B4%7D&preview=true,然后根据题目中的限制条件,可以得到:

equation?tex=%5Cleft%5C%7B%5Cbegin%7Bmatrix%7D%0Ax_%7B1%7D%2Bx_%7B2%7D%2Bx_%7B3%7D%2Bx_%7B4%7D%3D%5Clceil%20%5Cfrac%7Bn%7D%7B2%7D%20%5Crceil%20%5C%5C%20%0Ax_%7B3%7D%2Bx_%7B4%7D%3D(n_%7B2%7D-x_%7B2%7D)-(n_%7B4%7D-x_%7B4%7D)%0A%5Cend%7Bmatrix%7D%5Cright.%20&preview=true

在此基础上,还要满足每一类的人数必须为非负整数;两个方程,四个未知数;因此枚举任意两个变量,只要找到满足上述所有条件的任意一组解即可

复杂度

equation?tex=O(n%5E%7B2%7D)&preview=true

G2.Words Interesting

本体看上去很复杂,乍一看可能会想到字符串匹配等较高级的算法,但事实上仔细一分析本题的要求:

1.所有"源词汇"一定满足"有趣的单词"的给定顺序;因为构成"有趣的单词"的"源词汇"的数量不超过10,因此只需要直接逐个字符比对即可,若比对过程中有的字符对应不上,则不满足此项要求。

2.所有"源词汇"的字母种类必须与"有趣的单词"一致,且数量之和不能小于"有趣的单词"对应字母的数量;由于单词仅有小写字母构成,因此只需要建立两个字符的计数数组即可,如果出现其他种类的字符,或者字符数量不够,则不满足此项要求。复杂度

equation?tex=O(n)&preview=true

H.Words Fascinating

这道题要求的是本质不同的字符串的个数,如果只有一个字符串,直接建后缀自动机利用parent树或者DAG上DP就行。这道题目涉及多个字符串,我们对每个字符串建立后缀自动机,然后遍历所有的自动机上的点,如果这个节点没有字符c的转移边,就向其所在的字符串位置之后最近的字符串的后缀自动机的起始节点的字符c转移边对应的节点连一条转移边,然后DAG上DP计数即可

I.Mobius Ring

首先定义ans[x][y]为当怪兽位于位置x时,y先手情况下的胜负情况,那么ans[0][0]和ans[0][1]为必败态;其次考虑两人的策略:如果有一步操作能使自己的ans[x][y]抵达另一个人的必败态

equation?tex=ans%5B%7Bx%7D'%5D%5B%7By%7D'%5D&preview=true,则ans[x][y]为必胜态,而只有自己的所有操作都会抵达另一人的必胜态

equation?tex=ans%5B%7Bx%7D'%5D%5B%7By%7D'%5D&preview=true,自己的ans[x][y]才是必胜态,其余情况都为循环态

最后考虑状态的转移:对于y的必胜态ans[x][y],如果y'有一种操作s能使x'+s=x,那么ans[x'][y']为必胜态;

对于y的必胜态ans[x][y],如果y'有一种操作s能使x'+s=x,那么处于ans[x'][y']时就少一种操作的可能,我们以初读deg记录,当某一点的出度等同于自己的操作数时,该点为必败态;

除了0,0和0,1以外所有点初始都置为循环态,运用队列操作,执行一次BFS后还为循环态的点就是真正的循环态

J.Grid Painting

最小割的独立互斥模型,由于是要求最大值,我们考虑用总数减最小割来算,按如下建图,跑dinic求最小割即可

85e185e196f94c90bb981f0d6f3e10f9.png

K.Yet Another Bracket Sequence

判断括号序列匹配的算法:'('括号赋值为1,')'括号赋值为-1,若有n个括号,则计算[1,n]的前缀和=0,则括号序列匹配,不然不匹配。

由于需要动态维护括号序列,所以用线段树维护一下前缀和最值即可

L.Yet Another Stones Game

首先考虑以下两种情况:

1、如果有一堆石子被person1取空,那么person2可以将N/2堆全部取空以使person1面对不足N/2堆的局面

2.在这N堆石子可以被分成互为镜像的两部分(如:1,2,1,2)时,后手者可以模仿先手者操作,直到先手者取空只少一堆石子,情况转移至上一种可能,因此,若石子堆中有不多于N/2堆的石子数同为最少石子数时,先手者可以将排序后的后N/2堆石子取成前N/2堆石子的景象以获得胜利,若不满足此条件则不管先手者怎么取,后手者都能获胜

M.Yet Another Hanoi Problem

设将n个盘子从左边的柱子移动到右边的柱子所需的最小移动步数,那么最小的步数可以这样构造(一开始n个盘子都在左边的柱子上,将上面n-1个盘子打包,称为A,最下面也是最大的盘子成为B):

1、将A从左边的柱子移动到右边的柱子,移动步数为$$T_{n-1}

2、将B从左边的柱子移动到中间的柱子,移动步数为1

3、将A从右面的柱子移动左边的柱子,移动步数为

equation?tex=T_%7Bn-1%7D&preview=true

4、将B从中间的柱子移动到右面的柱子,移动步数为1

5、将A从左边的柱子移动到右边的柱子,移动步数为

equation?tex=T_%7Bn-1%7D&preview=true

综上,可以写出递归式

equation?tex=T_%7Bn%7D%20%3D%203T_%7Bn-1%7D%2B2&preview=true

equation?tex=T_%7Bn%7D%20%2B%201%20-%203(T_%7Bn-1%7D%20%2B%201)&preview=true

已知

equation?tex=T_%7B1%7D%20%2B%201%20%3D%203&preview=true,所以

equation?tex=T_%7Bn%7D%20%2B%201%20%3D%203%5En&preview=true

equation?tex=T_%7Bn%7D%20%3D%203%5En%20-%201&preview=true

复杂度:O(1)

当然本题如果不采用上述方法,也可以打表处理

复杂度:O(n)

N.Yet Another Infectious Virus

出题人认为的签到题,表达式代入求值即可。

当时出这道题,也是因为今年集训队训练过程中发生的一个有趣的现象;有一道英文题目,本身是签到题难度,由于前面多了一些乱七八糟的背景信息介绍,实际上都是和题目没有任何关系的信息,只是因为题目太长,导致最终没人去碰

复杂度O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值