竞赛讨论区 > 【题解】长春理工大学第十五届ACM竞赛队选拔赛
头像
编辑于 2019-12-18 14:47
+ 关注

【题解】长春理工大学第十五届ACM竞赛队选拔赛

G - 谭嫖裤序列

  • a[0] a[n-1] a[1] a[n-2]...的顺序输出即可(0下标数组,1下标同理)
  • 也可以设置l r变量,每次输出a[l] a[r],相逢后停止

A - Viviani

  • 仔细观察,可以用相似三角形推
  • 得到
  • ,其中C为三角形的周长,可以用距离公式得出
  • 的坐标没用,甚至C的坐标也可以没用
  • 注意不能直接使用cout输出,因为它的精度是六位有效数字而不是小数点后6位

L - 帕康斯战役

  • 田忌赛马
  • 设我方英雄按实力分为强中弱,敌方也是,当且仅当我方强能打过敌方中,我方中能打过敌方弱时才能获胜。
  • 当然也可以暴力把所有对阵情况判一遍,问题不大。

E - 王宁宁宁

  • n个字母X压缩成nX
  • 注意需要用最少的替换次数,使得缩写后的字符串长度最短
  • 只有两个特殊情况: X不需要变成1XXX不需要变成2X
  • 使用一个计数器维护需要输出的n,当两个相邻字符不相同时就根据题意输出,并重置计数器(为1)
  • 技巧: 在原字符串后面加一个字符?(其他非字母的也行),就无需在最后额外做输出

C - 友军寻路算法

  • 给出的输入数列是前缀和,相邻的前缀和相减即可得到两个路口间的距离。
  • 即判断数列中是否存在相邻的两个数的差
  • 从第二个数开始for循环,用一个变量记录是否出现l[i]-l[i-1]<L
  • 根据记录变量的值,输出OKGG

I - 西瓜汁加珍珠

  • 因为饮料的最低价格是2,且收益与价格相同,所以有结论:最大收益一定是购买一杯饮料后用剩下的所有钱购买珍珠。
  • 那么依次枚举每一种饮料即可。
  • 开场(现场赛)有dfs过的、dp过的,也都可以,但没必要

K - 扑克游戏V4

  • 事实上洗牌只做了一步操作: 将前a*k%b张牌,移动到第b张之后
  • 注意a*k可能爆long longk需要先对b取模
  • 数组其他位置顺序不变
  • 模拟轮流发牌的过程,计算最大值

M - 明天再来

  • 分情况讨论
  • 时间段开始时间早于终止时间
    • 当前时间(只看时间,不看日期,下同)早于开始时间,则输出开始时间(当天)
    • 当前时间早于终止时间,但不早于开始时间,则原封不动输出当前时间
    • 当前时间不早于终止时间,输出开始时间(第二天)
  • 时间段开始时间不早于终止时间
    • 当前时间早于终止时间,原封不动输出当前时间
    • 当前时间早于开始时间,但不晚于终止时间,输出开始时间(当天)
    • 当前时间不早于开始时间,原封不动输出当前时间
  • 其中第二天的日期计算,涉及到月份和闰年的计算
    • 谭浩强里有,对吧

B - 优秀的蓝链判断

  • 模拟。
    • 先判是否以http://https://开头,然后把这段[协议]去掉
    • 可以去掉最后一个/,如果存在的话
    • /分隔所有字符串
      • 对于第一段,用.分隔该段字符串
        • 判断最后一段是否由字母组成,并且长度>=2
        • 其他每一段,判断是否由数字、字母、下划线组成
      • 对于后面的几段,如果存在的话
        • 如果最后一段有且仅有一个.,用其分隔开成为两段
        • 对于上述操作后的每一段,判断是否由数字、字母、下划线组成
  • 使用正则表达式也是极好的做法
    • ^(https?:\/\/)?(\w+\.)+[a-zA-z]{2,}((\/\w+)*|((\/\w+)+\.\w+))\/?$

J - JK表达式

  • 分为两步
    • 编写函数判断一个字符串是纯数字组成还是一般字符串,以及数和字符串之间的互相转换
    • 对于两个字符串进行题目中的+运算,可以用运算符重载的方式
      • 例如重载成*(其他符号也可以,但是+可能有点问题),实现string operator*(string a,string b)
      • 输出a*(b*c*(d*e))*(f*(g*h*i))*(j*k),可以用任意文本编辑器,复制题目中的文字,将+替换成*
  • 编写普通函数,自行重新拼装输出的表达式也可以
    • F(F(F(a,F(F(b,c),F(d,e))),F(f,F(F(g,h),i))),F(j,k))

F - cls的字符串game

  • 简单搜索,会搜索的都可以直接秒掉
  • 由于数据随机,可以大胆来写
  • 可以加上set/hashset优化,普通dfs/bfs也没有卡,可以稳稳ac
  • 本题给了std 100倍时限,良心
  • 没学过dfs/bfs的可以去学习一下,嘻嘻
  • 学过dfs/bfs没ac的也建议重学一下,可能之前学的不太行
  • 上面都是出题人写的,个人觉得还是要注意写法问题
    • 合理使用string::findstring::replace,会比较理想

H - 二叉查找树

  • 按题意建立二叉查找树
  • 经典的递归
  • 之后需要对每一个结点以下的子树进行编码,用于判断形状是否相同
  • 一种可行的编码方式是,从该子树根节点向下递归,使用string:(左子树编码)x(右子树编码)
    • 例如样例一,编码为x(x(x(x))),而样例二编码为x((x)x(x))
  • 这一步递归可以只用一次遍历完成,复杂度较优。但是对于每个结点向下遍历n次,也可以通过。
  • 之后用set统计个数,或者暴力计数也可

D - 水仙花数

  • 首先我们比较容易得到一个暴力的解法
  • 从>=n的第一个k的倍数开始枚举n~m,每次i+=k,同时动态地维护目前枚举到的i的位数,计算i是否是一个X·水仙花数
  • 复杂度
  • 观察输出发现,符合题意的数会比较少,因此可以打表
  • 复杂度里有个除法,所以打前1000·水仙花数(范围是1~1e9)的表,就足够了; 对于x>1000,直接计算也不容易超时
  • 串行的打表方法可能需要的时间较长,约2~3小时
  • 因为X·水仙花数中的每个X互不影响,因此打表可以并行,打完再处理即可,约5~10分钟
  • 如果预处理幂,注意1~1e9范围中有十位数,需要开数组a[10][11]

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐