2016年“计蒜客”杯华中师范大学第十四届程序设计竞赛题解

A. 寻找字符串

对于一个字符串 s,定义一个函数 S(x),表示 s 中有多少个子串 x。现在给定 S(a),S(b),S(ab),S(ba)的值,求满足这 4 个值的字符串 s,如果有多个满足条件的字符串,输出字典序最小的。

s 中仅可能含有字符 a 和 b。

任何一个串的 S(ab) 与 S(ba) 的相差都不会超过1。可以分 S(ab)-S(ba) 为 0 -1 1 三种情况讨论。先构造出相应的 ab 相邻的串,再考虑按照字典序最小出要求将剩余的字母插入串中即可。

应该注意,这道问题有很多需要特判的情况。具体如何可以查看数据。

时间复杂度 O(S(a)+S(b))。

B. 幸运数字

定义幸运数字为数位(十进制)只含有 4 和 7 的数字。例如:4,7,47,777 等是幸运数字;5,72 等就不是幸运数字。

定义函数 next(n)表示大于等于 n 的最小的幸运数字,现在给你一个区间[a, b]让你求 S(a,b)=next(a)+next(a+1)+….+next(b-1)+next(b)的值。

由于幸运数字不多,可以预处理出来。计算查询范围内的幸运数字是多少个数字的 next,即可通过本题。

时间复杂度:O(29)。

C. 恩爱的回文数

因为最近身边脱单的人太多了,于是 GBX 狂热的迷上了回文数。因为回文数看起来就像是一对恩爱狗站在一起,他希望自己将来也有那么一天(虽然并不可能)。这一天他突然想到一个问题,长度不大于 n 的自然数中有多少是回文数?因为数据很大,所以最后的结果请对 1000000007 取模。

O(n) 枚举位即可通过本题。

D. 最强单身狗

有若干只单身狗排成一排,编号从 l 到 r。GBX 发现,一个单身狗的编号的二进制中 1 的数量越多,表示该单身狗越强(就是单身越久咯 -_-|||)。GBX 想找到一只最强的单身狗和他做朋友(强者惺惺相惜吧 >_<)。

如果有多个输出最小的那个。

1 必然放在低位更好,于是判断 l | (l+1) 是否在 [l, r] 内,如果是的话,输出 l = l | (l+1), 否则当前的 l 就是所求答案。

时间复杂度 O(log(r))。

E. 卡莉斯塔

Kalista 有一个技能叫撕裂,当该技能冷却完毕后,Kalista 进行普通攻击时会给目标增加一层可无限叠加的 debuff。Kalista 可以释放撕裂技能来引爆目标身上的 debuff(目标身上没有 debuff 时,无法撕裂),技能会造成基础伤害 a,每层 debuff 会增加 b 点伤害。Kalista 每次普通攻击会造成 x 点伤害,撕裂技能的冷却时间为 y(从技能开始释放的瞬间开始计算冷却)。

现在有一个敌人拥有 m 点生命值。那么 Kalista 最快需要多少秒时间能杀死该敌人(生命值小于等于 0 时,敌人死亡)?假定 Kalista 每秒可以普通攻击一次或者使用一次技能,不能在同一秒中使用技能并进行普通攻击;并且假设现在技能已经冷却完毕。

先计算出全部使用普通攻击的击杀时间,之后仅考虑使用技能的情况。

任何一个攻击序列,将最后释放的技能移动到最后,总伤害不会减少,于是可以假设最后一次一定是技能攻击。再次前提下,可以看做每次伤害都是 x+b。释放技能的伤害是 a 但代价是后面 y 回合伤害减少 b。这种模型下,使用技能占有优势或者劣势,分情况讨论即可得到最短击杀时间。

时间复杂度:O(1)。

F. 梦回三国

。。。。【背景略】

赤壁之战结束之后魏蜀吴三国决定握手求和,但是因为之前四处交战,把道路全部毁坏了,现在需要重新修路使得三国的国都能够连通.诸葛亮是这个项目的负责人,但是他太聪明了,对于这种题目都懒得思考了,于是就交给你了。

同一时间只能有一条道路在修建中,求最少用时。

结果容易发现是 min(d(u,A)+d(u,B)+d(u,C)),d(u,v) 表示 u 到 v 的最短路。于是可以计算三次单源最短路,枚举 u 得到结果。

时间复杂度:O(nlog(n)+m)。

G. FQ 的函数

FQ(k,p) 定义为: k!可被 pFQ(k,p) 整除,但是不能被 pFQ(k,p)+1整除。

ZQ 对 FQ 的发现很感兴趣,但是他对 FQ 在这个函数的讨论中仅使用十进制表示不满。ZQ于是定义了ZQ(n,p)。其中n 是个p进制正整数,并且 ZQ(n,p)=FQ(n10,p)。其中n10表示 n 转换成十进制之后对应的数字。

本题的任务就是求出 ZQ(n,p)的值。注意:请将答案表示为十进制数。

注意 n 是 p 进制数字,进行除以 p 的操作意味着舍弃最低位。

例如 n=(a1a2a3a4)p 那么所求结果就是 (a1a2a3)p+(a1a2)p+(a1)p。

可以预处理 1+p+p2+...+pi,即可 O(log(n)) 通过本题。

H. 数组反转

有一天,FQ 在玩一个游戏。

FQ 有个数组 a[1…k],一开始 a[i] = i (1 ≤ i ≤ k)。然后 FQ 不断的对这个数组进行操作,每次的操作都是把这个数组的一个区间反转。

举例来说 FQ 一开始有 a[1…5] = {1, 2, 3, 4, 5}。然后他将 a[2..4]反转,数组就变成了 a[1…5] = {1, 4, 3, 2, 5};再将 a[2..5] 反转,就得到了 a[1…5] = {1, 5, 2, 3, 4}。

FQ 总共对这个数组进行了 n 次操作,并把操作记录了下来。这个时候 ZQ 出场了,ZQ 找到了 FQ 的记录,但是由于天气原因,FQ 的记录不全——ZQ 得到的记录是 FQ 全部记录下的操作序列的一个子串。ZQ 就只得认为他得到的序列是 FQ 的全部操作。那么在 ZQ 看来,FQ 的序列最终是什么样子的呢?

可以预处理出初经过 1 到 i 的操作之后,相当于对一个数组进行怎样的变换。

对于每组 x y,找到数组 b[],它在经过前 x-1 个操作之后得到初始数组(a[i] = i)。对 b 进行 1 到 y 的操作对应的变换就可以得到结果。

时间复杂度 O((n+q)k)。

I. FQ 的气球

FQ 有 n 个气球,排成一排,顺次分别标号 1 到 n。FQ 要用 m 种颜色对它们染色,但是不希望有任何两个标号相邻的气球颜色是一样的。

聪明的 ZQ 马上意识到,FQ 一共有 m(m?1)n?1 种不同的染色方法。但是ZQ 发现有些方案颜色太繁杂,导致美观程度不足,为此 ZQ 给出了 k 个标号 a1,a2, a3, …, ak(1 ≤ ai ≤ n),并要求 FQ 给这 k 个标号对应的气球染的颜色是一样的。

于是现在 FQ 还有多少种染色方法?

k 个位置枚举颜色有 m 种;相邻两个标号中的颜色方案可以使用矩阵快速幂求解;a1 前和 ak 后的部分应该另行计算方法数目。

上述相乘即是答案,应该注意 k=0,m=1,有相邻标号等情况。

时间复杂度 O(klog(n))。

J. 绝园的双矩阵

有两个长 n 的数组 a[1..n]和 b[1..n],对这个两个数组进行两种操作。为了描述方便,我们先定义一个函数 f(n)。f(n)返回 n 模 232。

1. 给出一对区间边界 x, y(1 ≤ x ≤ y ≤ n),和四个参数 p, q, r, s。对于每个 i (x ≤ i ≤ y),计算 tmpa = f(a[i] × p + b[i] × q); tmpb= f(a[i] × r + b[i] × s)。然后再使得 a[i] = tmpa; b[i] = tmpb。

2. 给出一对区间边界 x, y(1 ≤ x ≤ y ≤ n),询问f(∑yi=x(a[i]×b[i]))是多少。

使用线段树,每个叶子节点存一个向量???a2abb2???。这样区间查询可以使用和向量的第二元来回答。

对每个点的更新,可以看做左乘一个矩阵:

????(pa+qb)2(pa+qb)(ra+sb)(ra+sb)2????=???p2prr22pqps+qr2rsq2qss2??????a2abb2???

当然对于区间的修改,可以使用懒标记修改矩阵优化时间到 O(log(n))。

时间复杂度是:O(n+mlog(n))。

比赛中有队伍用分块通过了这道问题。分块的时间复杂度虽然是 O(mn√),但是由于数据范围不大,估计运行只有 107.5,是可以很快通过的。

题目描述+标程+测试数据

http://download.csdn.net/download/ccnu_acm/9513829

本文作者

张静之

时间: 2024-12-16 13:16:11

2016年“计蒜客”杯华中师范大学第十四届程序设计竞赛题解的相关文章

(未完成)[HDUOJ]“字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛

solved 5 A(签到) 题意:两个人随机得到0或1其中之一数字,每个人都可以猜对方的数字是什么,有一个人猜对就算成功,问最优策略下00,01,10,11四种情况两人的成功概率分别是多少. 题意不明的签到题,题面说两人不能沟通,以为就是两个人随便猜,成功率都是1-0.5*0.5=0.75.结果是两个人可以提前商量好策略,那显然可以其中一个人猜和自己相同的数,另一个人猜和自己不同的数,那么所有的成功率都是100%. #include<bits/stdc++.h> using namespac

北京师范大学第十六届程序设计竞赛决赛-重现赛 ACFGI

A 塞特斯玛斯塔 题目描述 quailty是一名狂热的ACM音游选手,沉迷各种音乐游戏,比如Lunatic Rave 2,osu!之类的. 今天,quailty玩的是国内游戏厂商雷亚(并不是赞助商)出品的一款音乐游戏Cytus. 游戏中,玩家需要随着游戏界面中上下移动的扫描线来适时演奏对应音符. 当上下移动的黑色线(扫描线)与圆形的物体(音符)的圆心重合时点击音符. 普通音符(图中第一种)只需点击即可. 锁链音符(图中第二种)将带箭头的音符(滑块)按下后不要松开,并将滑块沿着斜线和圆点组成的路径

计蒜客 无脑博士和他的试管们

无脑博士有三个容量分别是A,B,C升的试管,A,B,C分别是三个从1到20的整数,最初,A和B试管都是空的,而C试管是装满硫酸铜溶液的.有时,无脑博士把硫酸铜溶液从一个试管倒到另一个试管中,直到被灌试管装满或原试管空了.当然每一次灌注都是完全的.由于无脑博士天天这么折腾,早已熟练,溶液在倒的过程中不会有丢失. 写一个程序去帮助无脑博士找出当A是个是空的时候,C试管中硫酸铜溶液所剩量的所有可能性. 输入包括一行,为空格分隔开的三个数,分别为整数A,B和C. 输出包括一行,升序地列出当A试管是空的时

简单斐波那契——计蒜客(4)

题目来自“计蒜客”第4题. 解算法题之前,务必先写出与之对应的数学表达式,用于描述算法. 数学描述如图: 根据“数学描述“,写出代码如下: #include <stdio.h> int main() { int N =0 ; scanf("%d", &N); int i, fn1 = 1, fn2 = 0, fn; switch(N) { case 0: printf("0"); break; case 1: printf("1&quo

计蒜客普及组模拟赛

今天没事闲的看到计蒜客有个普及组模拟赛,就当练了练手去打了,成绩低的可怜...400分崩成280分AK梦想化作泡影 第一题 同学的爱好 链接:https://nanti.jisuanke.com/t/17291 小学应用题难度?大概画个图就能懂,把每个部分都标上号,算出a,b,c,d,e,f的部分,进行运算就行了. 不多解释了,直接上代码 #include<iostream> #include<cstdio> #include<algorithm> #include&l

计蒜客 作弊揭发者(string的应用)

鉴于我市拥堵的交通状况,市政交管部门经过听证决定在道路两侧安置自动停车收费系统.当车辆驶入车位,系统会通过配有的摄像头拍摄车辆画面,通过识别车牌上的数字.字母序列识别车牌,通过连接车管所车辆信息数据库确认车辆,进行扣费. 斗智斗勇的好戏一般从此处展开… 一些车主通过在停车时遮挡车牌上的一个或多个数字.字母序列,来阻碍识别系统的识别工作,以此逃避停车费用的缴纳. 车主这简直是用轻轻的一挡搞出来一个世界难题有木有?!管理是一方面,技术解决才是王道啊. 这么难的项目不得不交给计蒜客实验室了.D 神负责

计蒜客 删除字母&#39;c&#39;

删除字母'c' 右侧的程序实现的功能是从字符串s中删除所有的小写字母c,请改正程序错误的地方. 注意:main函数不可以改动,程序结构也不能修改. 很简单的哦,加油吧- 样例输入 abccabcn 样例输出 ababn 1 #include <stdio.h> 2 3 #define N 1024 4 5 void del(char *s) 6 { 7 int i, j; 8 for(i = j = 0; s[i] != '\0'; i++) 9 { 10 if(s[i] != 'c') 11

计蒜客 教科书般的亵渎

Description: 环境里有 nn 个怪物,他们的生命值用一个正整数表示.现在,你可以使用两种魔法,对怪物进行攻击.当怪物的生命值小于等于 00 时,他便被消灭了. 魔法箭,对摸个生物造成 kk 点伤害,对一个生物最多使用一次,但没有使用次数限制. 亵渎,对所有生物造成一点伤害,如果杀死了某个生物,则继续自动重新使用该法术.只能主动使用一次,且必须最后使用. 请问,最多能消灭多少个怪物?亵渎法术最多能释放几次? Input: 第一行两个整数 nn 和 kk ,表示怪物的数量和法术的伤害.第

“青软杯”安徽科技学院第六届程序设计大赛_专业组

Contest - "青软杯"安徽科技学院第六届程序设计大赛_专业组 Start time:  2015-04-18 08:00:00.0  End time:  2015-04-18 12:00:00.0 Current System Time:  2015-04-21 00:07:42.57  Contest Status:   Ended 关于举办"青软杯"安徽科技学院 第六届程序设计大赛通知 ACM 国际大学生程序设计竞赛 (International Co