Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

说一下省时间和省内存的方法(160K 32MS)

Posted by HolyDemon at 2011-06-02 01:34:13 on Problem 1745 and last updated at 2011-06-02 01:35:06
一开始按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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator