UVa 10602 - Editor Nottoobad
链接
大意
给出一些单词,第一个必须手动输入,后面的有两种方式可以语音辅助输入:
- 重复上个输入的单词
- 删除最后一个字符
输出最少的手动输入按键次数,和单词输入顺序。
思路
尽量多的利用辅助减少按键的次数,每次都优先输出与上一个输出单词的lcp长度最长的单词,以最大限度地利用辅助。
代码
1 |
|
给出一些单词,第一个必须手动输入,后面的有两种方式可以语音辅助输入:
输出最少的手动输入按键次数,和单词输入顺序。
尽量多的利用辅助减少按键的次数,每次都优先输出与上一个输出单词的lcp长度最长的单词,以最大限度地利用辅助。
1 | #include <cstdio> |
定义长度为\(m+1\)的\(n\)加法链为首元素为\(a[0]=0\),末元素\(a[m]=n\),严格递增且数列中除首项之外,其余项均满足\(a[k]=a[i]+a[j],(1 \leq i,j \leq k-1)\)的数列。给出\(n\),满足条件的最小的\(m\)和加法链。
枚举长度进行验证,注意以下几点:
1 | #include <cstdio> |
给出\(n \times n\)的矩阵,最初在最左上的点,可以像上下左右4个方向移动,每次移动\(k\)步(每次移动的步数\(k\)不能相同),可以删除任意数量的必然无法走到的卡片。然后继续移动,直至只剩下一张卡片。
每次都走奇数步,根据奇偶性,可知,不会走到与当前格子在同一斜线上的格子,然后删除最左上的一条斜线上的所有纸片。
1 | #include <cstdio> |
给出\(n\)个圆柱形蛋糕的底面半径\(r\)和高度\(h\)。要将蛋糕放在桌子上,后面的蛋糕可以放在前面的比它小的蛋糕上,或者放到桌子上。输出放在一起的蛋糕的最大总体积。
计算蛋糕的体积并排序,然后目标转化为求上升子序列和的最大值。得到状态转移方程\(d[i]=max(d[j],j<i,V[j]<V[i])+V[i]\)。为了求出\(max(d[j],j<i,V[j]<V[i])\),使用线段树储存\(d[i]\)的值,保存每个节点的原始序列位置\(p[i]\),每次查询,区间\([0,p[i]]\)的最大值。然后更新\(p[i]\)节点的值为\(d[i]\)。
1 | #include <cstdio> |
给出一段长度为\(m\)括号序列,在它的前后添加"("和")"使得长度变为\(n\),输出使最终序列合法的添加方式数目。
定义状态\(d[i][j]\)表示长度为\(i\),最终还需\(j\)个")"才能完全匹配的的合法序列前缀数目。可以得到状态转移公式\(d[i][j]=d[i-1][j-1]+d[i-1][j+1]\)。预处理后,枚举在原始序列前面添加的长度计算方案数目和。
1 | #include <cstdio> |
给出\(r \times c (1 \leq r,c \leq 20)\)的矩阵,代表推箱子的地图,输出把箱子推到指定地点的方案,要求推的次数最少,推的次数相同时,人走动的次数尽量少。
可以将推的次数和走动次数转化为一个权值,将人的位置和箱子的位置作为状态,进行bfs,记录每个状态到达的最小权值。
1 | #include <cstdio> |
手机蜂窝数据可以得到手机在\(n\)个地方的概率,\(p_i\)。现在要查询手机的位置,可以分成\(w\)组,分别查询,输出查询次数的期望值的最小值。
要使查询次数最小,应该优先查找存在概率高的地点,先对位置排序。然后设状态\(d[i][j]\)为前\(i\)个地点,分成\(j\)组查询的最小期望。对于每个状态,可以通过枚举最后一组的大小进行转移。
1 | #include <cstdio> |
给出一个字符串,输出它的最长回文子串。
将原字符串反转后求LCS,保留字典序最小的LCS。由求出的LCS字典序最小,因而无法保证回文,比如:\(cbcabcb\)、\(bcbacbc\)求出的LCS为\(bcabc\),而最长回文子串\(bcacb\)由于字典序比\(bcabc\)大被替换掉了。因此要取LCS前半部分构造出回文子串。
1 | #include <cstdio> |
给出数列\({a_i}\)输出最长的长度为\(2n+1\)的前\(n\)项严格递增,后\(n\)项严格递减的子序列的长度。
求两边LIS,枚举每个点的上升前缀\(d1_i\)和下降后缀\(d2_i\),答案为\(max(min(d1_i,d2_i)*2-1)\)。
1 | #include <cstdio> |
给出\(n\)个星球的位置和广播的类型,定义接受与自身不同类型的个数大于相同类型个数的星球为间谍星球(星球自身的广播也算在内),输出使间谍星球个数的最大值,和最大值下的接受半径。
枚举所有星球间的边,从小到大排序,依次将边加入。注意加边时要将同长度的边一起加入。
1 | #include <cstdio> |