摘要: 这题只需要预处理两个数组就可以了,那就是一个保留从1到N,这个N个数字连在一起的长度,以及另外一个数组表示重复打印112123...123..N的这样一个打印到N的串的长度。接下来进行两次二分查找便可得到答案了。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#define MAXN 32000using namespace std;typedef long long int Int64;Int64 N, c[MAXN+5], s[MAXN+5];inline int Len(int x){ 阅读全文
posted @ 2012-08-13 19:11 沐阳 阅读(359) 评论(0) 推荐(0) 编辑
摘要: 前面用组合数学来写这题实在是被边界条件搞得头昏脑胀,这里就直接按位DP,每次dfs传递0和1的个数这两个参数下去即可。代码如下:#include <cstdlib>#include <cstdio>#include <cstring>using namespace std;int a, b, bit[35], dp[35][35][35];int dfs(int pos, int zero, int one, int limit){ if (pos == -1) { return zero >= one; } if (!limit && 阅读全文
posted @ 2012-08-13 16:43 沐阳 阅读(363) 评论(0) 推荐(0) 编辑
摘要: http://acm.timus.ru/problem.aspx?space=1&num=1057其实这题可以算是一个组合数的题目了,主要是将基于其他进制转化为基于2进制的算法,对于某一位不为1的话,那么取其他位的话是一定不满足题意的,所以要找到一个数的最高位大于1,将这一位以及后面的每一位都赋值为1,然后就是一个按位DP的过程了,dp[len][statu]表示长度剩余量为len,要求1的个数为statu个时,并且对后面的位没有要求的情况下,所有可能的解。代码如下:#include <cstring>#include <cstdio>#include < 阅读全文
posted @ 2012-08-13 16:01 沐阳 阅读(284) 评论(0) 推荐(0) 编辑
摘要: 这题的状态真的是很难想到,网上的代码都惊人的相似...另一种解法,相比而言好接受一点:#include <cstring>#include <cstdio>#include <cstdlib>#include <algorithm>using namespace std;typedef unsigned long long Int64;Int64 dp[20][3], N;int digit[20];Int64 dfs(int pos, int statu, int limit){ if (pos == -1) { // 如果到了已经枚举了最后一 阅读全文
posted @ 2012-08-13 01:31 沐阳 阅读(473) 评论(2) 推荐(0) 编辑