第一题:http://www.acmore.net/problem.php?id=1461
这题的题意是: 给你一个长度为n的数字序列,这n个数字序列可以向右移动K次(0<=K<=n-1),通过移动,会得到n个不同的序列,那么 这n个不同的序列里有多少个序列
满足 前i个数的和 大于等于0(1<=i<=n). n的范围是 1<=n<=10^6
很容易想到一种暴力的方法。求出以i为第一项 往后扫描 扫n个数。 i后不足n个数的右从1开始计数。 检查这个序列是否满足题意。 这样暴力的时间复杂度是o(N^2).而n的范围
是1<=n<=10^6 所以这种暴力明显不行。
换一种思想。我们从序列的后面往前面扫描。如果遇到一个数a[i]是负数。说明以a[i]为开头的序列一定是不满足题意的。 同理 我们往前继续累加。累加到a[j], 如果这个累加的和依然是负数,说明以a[j]为开头的序列也一定不满足题意。。 这样的算法的时间复杂度将会缩减到o(N);
第二题:http://www.acmore.net/problem.php?id=1462
模拟+贪心。 猫每次有三种 选择。 1 直接走1步。2 带能量跳跃的最短步数,3.休息。
code:http://codepad.org/hm0vS6q7
第三题:http://www.acmore.net/problem.php?id=1463
动态规划类的。 状态转移方程写不来。 借鉴别人的思想才AC的 。
定义dp[i][j] //表示 前i个兔纸的栈里还剩下j个兔子没有被消除。 那么放入第i个兔子会有两种影响。 一种是消除3个兔子。 另一种是增加一个兔子。
那么状态转移方程: dp[i][j]= dp[i-1][j+1]+dp[i-1][j-2];
dp[i][2]时有些特殊。 因为对于站内的兔子颜色没有限制 ,其他状态有限制。 dp[i][2]=dp[i-1][j+1]+2*dp[i-1][0];
第四题:http://www.acmore.net/problem.php?id=1464
简单数据结构。关键是思考两个问题:1,如何存储100,000 *100,000 这么大的数据(肯定是不能用二维数组保存的),2.如何进行行列间的变换。
问题1:可以用 map<pair<int,int>,int > 这样记录所在行列的坐标还有权值。
问题2:开两个数组,f1,和f2 。f1[i] 表示当前第i行通过变换后,实际所在的行号。f2[i] 表示当前第i列通过变换后,实际所在的列号。
第五题:
第六题:http://www.acmore.net/problem.php?id=1466
晚上写的时候,还是WA了两次才AC```T^T.第一次是出去最前面的空格,和最后面的空格时的break;第二次是当m(纸的数量)比空格的数量大的时候,空格被减完了,没有跳出循环。
正解思路是,先让一张纸盖满整个格子,再贪心的减去最大的单位空格量,直到最后纸被分的数量=m(单位空格量充足),或者减完所有单位空格这时又纸的数量<=m.
注意:
1. 单位空格量(连续的空格为一个单位)的统计,排序后,贪心的先减去单位空格大的(即连续空格数目多的)。
2. 在减去单位空格时,若没有单位空格了,要跳出循环。
第七题:http://www.acmore.net/problem.php?id=1467
开始想到先求出分子总乘积的%MOD=(1e9+7),再除以分母,然后果断WA←_←.(%运算只有+,—,*)
正解思路是先将分子除去分母i,此时变成了1到(i-1),(i+1)到n的乘积取模。
我是有了两个数组dp1[],dp2[]分别存储1到n和n到1的乘积模,dp[0]=dp[n+1]=1;
即 dp1[1]=A1%MOD; dp2[n]=An%MOD;
dp1[2]=(A1*A2)%MOD; dp1[n-1]=(An*An-1)%MOD;
````` `````
那么所求的答案 Bi=(dp1[i-1]*dp2[i+1])%MOD;
第八题:http://acmore.net/problem.php?id=1469
原题 HDU1010
BFS(胡大的): http://codepad.org/kgvInXup
还是没搞懂胡大的vis[10][10][10][10][50]数组是干嘛的。
DFS: http://codepad.org/MqCPjuP5
原以为数据很小,直接暴力DFS即可。结果WA到蛋疼。。可能数据量很大。。
xiao賤说加一个奇偶剪枝就可以了。
回去,搞了搞,在HDU上交还是TLE。 最后, 直到我把我能想到的剪枝全加上才AC!!!