1001 A Runing Game
这题因为排名和位置都唯一,所以可以按排名排序,如果当前位置比上个位置大,总长度变为当前圈数加当前位置;如果当前位置比上个位置小,总长度变为当前圈数加一圈再加当前位置,这样就可以使总长度最小,然后总长度与给定长度比较即可
1002 Block by Block
先对block排序,末端越大排后面。如果不加高度限制的话,设dp[i][j]表示i到j之间能容纳的最多数量,可以很好的给出DP方程dp[i][j] = max(dp[i][k]+dp[k][j])+1,(i<k<j);现在加了个高度限制,于是就自然想到dp[i][j][h]表示i到j之间高度为h的最多数量,dp[i][j][h] = max(dp[i][k][h-1],dp[j][k][h-1])+1,(i<k<j); 首先空间最好降一维,可以直接设成dp[i][h],方程不变只是多开了一个辅助数组,还是一样的。这样复杂度算了下是h*n^3,可以用线段树优化到h*n^2logn,貌似暴力的也能过
1003 Cyclic Nacklace
本题的题意为给定一个字符串,求至少添加多少字符使得添加后的字符串是一个以特定字母循环的长串(循环次数大于等于2)。
首先可以确定,在左端增加字母和右端增加的效果是等同的,因为最终链将连成环,可以将左边加的移到右边。接下来就是求循环节长度。方法不唯一,我用的是KMP算法,最小循环节的长度为Len - next[Len]。next[]数组保存的是失败指针,也就是以当前节点结尾的后缀与前缀的最长公共长度,Len为原字符串的长度。很明显,当Len能被Len - next[Len]整除时不需要添加,否则需要添加缺损的个数使它能被整除。
1004 Download
本题求的是最少的点击次数,不难想到对于两种特殊的按键:
全选:最多只会用到一次,假如要用,一定是在最一开始用。
反选:最多只会用到一次,假如要用,何时用都不会影响结果。
这样可以分4种情况讨论,即都不用,用全选不用反选,用反选不用全选,都用。去最小值即可。
1005 Equivalent mass
这题看数据量肯定不能暴力,我的做法是,先分三堆,第一堆数量是n/2,第二堆是互相矛盾的数字,第三堆则是剩下的,然后先对第二堆和第三堆进行合并,保证里面的数不冲突,并记录合并成的新数字是由几个数组成的,可以用vector方便实现。。然后第一堆暴力枚举对合并的堆进行二分查找所需要的数~~
1006 Financial Crisis
本题题意是在一个无向图中询问两个节点是否存在两条路径,使其除该两点外无公共点。转化一下就是判定是否存在一个环同时包含这两点。方法是:
首先判连通性,可以直接DFS标记,或者用并查集标记,如果不连通则没有路;
通过求无向图的点双连通分量,若两点在同一双连通通分量中,则说明必存在环。
有个小陷阱:当求得的是退化的双连通分量,即该分量中只含有一条边,此时需要特殊处理,必须记录每个分量中含有边的条数。
1007 Guess Game
本题属于简单题,知道期望什么意思就好做了。如果是n,遍历1-n,求出每个数所需的次数,然后加起来除以n便是答案。
1008 HDU CakeMan
这题难点就是在如何找必经点,我的做法是做三次BFS,第一、二次分别是求出起点与终点到各个点的最短路径,然后保存最短路径的所有点,对这些点判断是不是必经点;必经点可以根据如果在同一时刻同时到达有两个不同点,则这两个点都不是必经点。。第三次BFS就普通的城管寻找必经点了。。
PS:对这题感到十分抱歉,因标程没仔细测过,导致数据有误,好在没有多少人在做这题且到最后做对的人也只有一个~~
1009 Is the one been second-killed first?
这题是最简单的题,稍微想想就可知道M必须是偶数且大于或等于2*N就可