A - Sushi for Two(签到)
题意
在一个 01
序列中找出长为偶数的连续的一段使得它前一半和后一半内部分别相同,而前一半和后一半不同。
思路
纸上模拟了一下然后预处理 赛后发现太麻烦了
1 |
|
B - Circus (数学,推公式)
题意
有 n个人,需要把它们分成两组,每组恰好 2/n 个人。每个人可能会技能 11或技能 2,一个人可能会其中一种、两种都会或什么都不会。
要求第一组中会技能 1的人数恰好等于第二组中会技能 2 的人数,输出方案
2<=n<=5000
思路
比赛在纸上写了两张纸都没写出来的题
参考https://www.cnblogs.com/wjyyy/p/cf1138.html
1 |
|
C - Skyscrapers (离散化+贪心)
题意
有一个 n×m的矩阵 aijaij。
对于每个 (i,j)1≤i≤n1≤i≤n),你把第 i行和第 j 列单独抽出,这样就有 n+m−1 个数被你抽出。
你可以对这些数重新标号为正整数,但是要满足第 i行所有数的大小关系不变,第 j列所有数的大小关系不变(两个限制相互独立)。
满足这个限制下,你希望最大的标号尽量小,对每个 (i,j) 求出这个最小的最大标号。
思路
因为行大小关系不变,列大小关系不变,我们考虑分别离散化每行每列,并统计每个数在行内和列内的排名。
然后贪心取个最大的
1 |
|
D - Camp Schedule (KMP 贪心)
题意
有两个 01 串 s 和 t,要求重新排列 s 使得 t 在重新排列后的 s 中出现次数尽量多(位置相交的出现也算)。
思路
一眼KMP 求出T的next数组,然后贪心重叠匹配 关键是可以位置相交
1 |
|
F - Cooperative Game (Floyd判环,龟兔赛跑算法)
题意
一个条路 连着一个环,路和环的连接点定义为终点
十个人 每次可以移动一些人向前单项移动(参考链表)
交互题,每次选择一个人的编号让他想前移动
之后系统会告诉你现在哪些点有人,分别是谁
把所有人移动到终点就输出“done”结束
思路
裸的Floyd算法 过程完全一模一样
首先让两个人一个一次移动一步,一个一次移动两步。
然后两人会在一个点相遇。次数假设慢的人经过的距离为$s$ 那么快的人距离为$2s$
$s=m+i*l+k$ 1式
$2s=m+j*l+k$ 2式
两式相减
$s=(j-i)l$ 3式
带入1式
所以当一个点开始从m走到起点时,另一个点也走到了开始的地方
我的想法
1 | 假设出发起点到环起点的距离为m,已经确定有环,环的周长为n,(第一次)相遇点距离环的起点的距离是k。那么当两者相遇时,慢指针(t)移动的总距离i = m + a * n + k,快指针(h)的移动距离为2i,2i = m + b * n + k。其中,a和b分别为t和h在第一次相遇时转过的圈数。让两者相减(快减慢),那么有i = (b - a) * n。即i是圈长度的倍数。 |
1 |
|