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
不需要变成1X
、XX
不需要变成2X
- 使用一个计数器维护需要输出的n,当两个相邻字符不相同时就根据题意输出,并重置计数器(为1)
- 技巧: 在原字符串后面加一个字符
?
(其他非字母的也行),就无需在最后额外做输出
C - 友军寻路算法
- 给出的输入数列是前缀和,相邻的前缀和相减即可得到两个路口间的距离。
- 即判断数列中是否存在相邻的两个数的差
- 从第二个数开始for循环,用一个变量记录是否出现
l[i]-l[i-1]<L
- 根据记录变量的值,输出
OK
或GG
I - 西瓜汁加珍珠
- 因为饮料的最低价格是2,且收益与价格相同,所以有结论:最大收益一定是购买一杯饮料后用剩下的所有钱购买珍珠。
- 那么依次枚举每一种饮料即可。
- 开场(现场赛)有
dfs
过的、dp
过的,也都可以,但没必要
K - 扑克游戏V4
- 事实上洗牌只做了一步操作: 将前
a*k%b
张牌,移动到第b
张之后 - 注意
a*k
可能爆long long
,k
需要先对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::find
和string::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) 回帖