Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
说一下省时间和省内存的方法(160K 32MS)一开始按O(nk)的方法做完219ms 然后看了一下排名发现大牛们testcase大牛在2011-03-27的提交用了32ms过了 突然意识到这题还有优化——位运算 之前用f[i][j] 表示前i个数得到的和模k后能否得到j 现在把f[1][0],f[1][1]……f[1][k-1]看成一个k位二进制数B[i]的每一位,令ti=num[i]%k 那么只要把B[i-1]的最后ti位放到最前面,然后再整体右移ti位,就得到B[i]了。ti为负值和ti取符号的情况类似。 这样可以把时间复杂的降到O(n) 不过100位的二进制数字不好存啊,我是拆成了两个unsigned long long,不知道有没有什么好方法,还望各位大牛不吝赐教 省内存有两个方面,一个是B[i]可以做成滚动数组,这个和常规做法是一样的。另一个就是num[10000]这个数组可以去掉,因为一个数字只用得到一次,所以读一个num算一个B就可以了。 你可能觉得没啥用,不过正是靠着这么剩下来的40k的内存我才挤到了前10,第一次啊,不容易啊! Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator