2016.8.2测试结题报告(number,circle,submatrix)

1.小朋友的数字
对于这道题我只能说这是一道语文题,在考试的时候我为了理解它更加的通畅我特意整理了一个叫做something I should know.txt的东西(我的个人习惯):
1.显然这道题的题意就是求最大子段和。
2.如果第(i-1)位及之前的最大子段和大于0,这一位取了也不会让答案减少,我们让当前这一位和前面一段连接起来。否则,我们重开一段。
3.如果扫描到的特征值大于0,分数为前一个分数加上前一个特征值。更新最大值。
4.如果他的前一个小朋友的特征值小于0,那他的分数就为第二个小朋友的分数。
代码就不粘了,自己脑补。时空复杂度都是线性的。
2.循环
这道题我写到最后终于放弃写这个东西了(但是说不定我明天就写了),然而我还是在考试时间之内就想到了这道题的正解。当我看见题中的“最后k位”时我就想到了基数排序这一神奇的思想,显然正解也差不多是这个意思。
首先我们确定最后一位的循环节的长度,我们设一组数据。

假使输入数据为198123 4
①截取后4位8123,只需对8123做处理(输入时需注意,首先输入一个字符串,分割出后k位后进行存储以供运算)

②首先取最后一位3,暴力枚举最后一位的最小循环节(注意此时要判断是否存在循环,如不存在输出-1)
枚举的结果分别为3,9,7,1,*3,循环长度为4

③此时,取后两位23:每一次都乘以23实在是太慢了,我们考虑一次基数排序的思想
,在确定了第一位之后,我们知道只有每次至少乘以第一位的循环节倍的原数字才能在确定第二位的时候保证第一位相同。所以我们每次把这个数乘以23^4(注意!此处只取后两位即可,既41(23^4mod100))
23*41^n的循环节为43 63 83 03 23 循环节长度为5,此时,循环总长度变为4*5=20

④第3步操作,取后三位123:(123^20) mod 1000=201(这里的方操作要写一个快速幂,不用高精取余,只需要保留后几位即可)

⑤还是一样,取后四位8123:(8123^100) mod 10000=6001
8123*6001^n的循环节位6123 4123 2123 0123 8123 循环节长度为5,此时总长度位100*5=500

得出答案,输出即可。
这里还要注意一些东西,就是最后的答案是高精。
3.子矩阵
这道题作为我考试的时候A的唯一一道题,我感觉这道题很水只是思路很迥异,我只是误打误撞。我先是写了一个搜索剪枝后来自己来了一组随机数据就T了。所以我把后一半搜索改成了一个正宗dp。下面内容仍然引自我写的something I should know.
把暴搜的后半部分一改,把二维压成一维,DP方程:
y[i]表示第i列r行总共的绝对值;x[i,j]表示r行总共的第i列与第j列的绝对值(将r行的值一起算)
状态转移方程:f[i,j]=min(f[k,j-1]+x[k,i])+y[i]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值