摘要: 这题要注意的就是要构造出两个端点出来,然后直接开辟状态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) 编辑
摘要: 比赛的时候竟然没有想到这题可以用树状数组过,由于数字的区间比较小,所以直接开设一个树状数组,定义sum(i) 表示小于i的数的总数。那么判定一个数是否有的条件就是计算sum(i+1) == sum(i) 便可以了,查找第K大的数,也就可以直接二分了。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#define MAXN 100000using namespace std;int c[MAXN+5];int lowbit(int x){ r 阅读全文
posted @ 2012-08-12 20:28 沐阳 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 这题可以用二分枚举答案来求解,每次枚举一个答案时我们总是选取满足要求的每个零件的价格最小者,如果金钱能够满足的话就枚举一个更大的质量,这里最好将质量离散化,这样就能枚举每个点都用相应的品质对应。代码如下:#include <cstring>#include <cstdio>#include <cstdlib>#include <algorithm>#include <map>using namespace std;map<int,int>mp;int fee[1005];struct Node{ char name[25] 阅读全文
posted @ 2012-08-12 20:06 沐阳 阅读(381) 评论(0) 推荐(0) 编辑
摘要: 该题题意是要求给定a,b区间内有多少个数满足二进制表示法内0的数目多余1的数目。详见代码:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int c[40][40];void pre(){ c[0][0] = 1; for (int i = 1; i <= 30; ++i) { c[0][i] = 1; for (int j = 1; j <= 30; ++j) { c[j][i] = c[j][. 阅读全文
posted @ 2012-08-12 10:05 沐阳 阅读(228) 评论(0) 推荐(0) 编辑