上一页 1 ··· 27 28 29 30 31 32 33 34 35 ··· 66 下一页
摘要: 首先将没有特殊点的所有的情况都计算出来,再将给定的点都计算到左上角的标记点,最后查看有多少个点已经被覆盖了,减去该部分,最后用快速幂输出结果,注意这里要用long long。代码如下:#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>#include<queue>#include<set>#include<map>#include<cstring>#include< 阅读全文
posted @ 2012-08-15 16:54 沐阳 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 简单矩阵...代码如下:#include <cstring>#include <cstdio>#include <cstdlib>#include <iostream>using namespace std;unsigned int temp[5][5] = { {0, 0, 0, 0, 0}, {0, 2, 3, 1, 1}, {0, 1, 2, 3, 1}, {0, 1, 1, 2, 3}, {0, 3, 1, 1, 2}};unsigned int fix(unsigned int x){ if (x > 0xff) { x ^= 0 阅读全文
posted @ 2012-08-15 11:21 沐阳 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 记录每个节点从四个方向来的最优值,用了那个spfa后,因为要标记入队,所以就会牵涉到一个节点的自环现象,所以这里就直接在队列里面记录其当前距离,不进行队列优化,也过了。该题的边竟然是双向的。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include <algorithm>#include <queue>using namespace std;typedef long long int Int64;int N, M, idx, mp[255], head[1500 阅读全文
posted @ 2012-08-15 10:05 沐阳 阅读(358) 评论(0) 推荐(0) 编辑
摘要: 这题虽然说是什么按位DP,其实尼玛不是组合数学么。不过硬是用模板的按位DP实现了,其实也就是记忆化搜索,本题恶心就在于有负数的存在,其实对付它就是把正数的第33位都变成1,用long long来处理,这样既保证了负数小于正数,又可以化成单一的区间了。在按位统计的时候记得当1出现在33位的时候不统计这个1。这题思路也就是先把[a, b]区间内含有一个1,两个1,三个1...的数的个数全部统计出来,一个for循环就能够找出该数字出现在有几个1的一段上,然后再二分查找答案,最后输出。代码如下:#include <cstdlib>#include <cstring>#inclu 阅读全文
posted @ 2012-08-14 10:32 沐阳 阅读(688) 评论(0) 推荐(0) 编辑
摘要: 这题只需要预处理两个数组就可以了,那就是一个保留从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) 编辑
摘要: 这题要注意的就是要构造出两个端点出来,然后直接开辟状态dp[i][j]表示i,j之间的囚犯都救出的最少的金币数,注意此时的边界i,j是不取的。初始条件是dp[i][i+1] = 0.代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include<iostream>using namespace std;const int inf = 0x3fffffff;int N, P, loc[105], dp[105][105];int dfs(int a, int b){ if(b - 阅读全文
posted @ 2012-08-12 23:23 沐阳 阅读(372) 评论(0) 推荐(0) 编辑
摘要: 这题一开始便想着DP求解,但是细想一下是不对的,因为这种位操作在没有到最后一次计算时是无法得到最优解的,也即不存在最优子结构。首先当 a 与 b 做运算时,我们分析64位上的每一位,我们知道 & 和 ^ 操作总是有一个可以产生0的,那么对于两个64的数而言我们总可以至少使得其32位等于0,再将这个数x与c做运算的话,我们就直接把x & c,那些已经为0的位一定会还是0,其余的位不是0就是1,如果结果中 1比0多,那么我们对c取反,反正就是至少会有一半变成0,以此下去超过6个数,那么这个数就一定就是0了。对于小于0的情况,我们就直接暴力。代码如下:#include <cst 阅读全文
posted @ 2012-08-12 21:30 沐阳 阅读(323) 评论(0) 推荐(0) 编辑
上一页 1 ··· 27 28 29 30 31 32 33 34 35 ··· 66 下一页