2013年3月31日

UVA10718 - Bit Mask

摘要: 看到这个题我们简单的思路就是从L到R逐个数的暴力,但是人家有明显提示了,所以我们要另寻妙法了要求从某个范围里找到M,使得M|N最大,如果有多个M满足最大的话就输出最小的,考虑第一个条件,找到M使得M|N最大,那么我们应该从二进制方向出发,使得M|N最大,则我们从最高位到最低位比较,如果N对应的数是0的话,在其他条件合适的话肯定让M对应的该位数为1。如果N对应的数是1的话,则此时我们为了满足第二个条件,应当使得M的该数位上的数为0,但是我们还要考虑范围因素,每次都得判断M|N是否在范围内,如果超过了,则就舍弃该数位等于1的机会,如果还不足L,则及时加上,即让该数位等与1#include int. 阅读全文
posted @ 2013-03-31 21:15 Primo... 阅读(139) 评论(0) 推荐(0)

uva10400 - Game Show Math

摘要: 看到这道题,确实让我想到了dfs,但是p=100的上限让我望而却步,,,,后来知道dfs+强剪枝或者称为记忆化搜索dp这道题为什么记忆化搜索后变得这么高效呢,从4^100>>>64000*100是怎么转变的呢,原因是这道题的特设条件,(-32000,32000)顶多有64000个状态,每个数有可能在100层中的任何一层的话,那么时间复杂度就变成了64000*100了这就是记忆化在特定区域内的作用。。。。。代码如下:#include #include #define M 105 int st[M], targe, n, pa[M], dp[M][64010]; int dfs( 阅读全文
posted @ 2013-03-31 16:44 Primo... 阅读(155) 评论(0) 推荐(0)

uva10602 - Editor Nottoobad

摘要: 大水题。。。比较前缀,,,,,代码如下:#include #include #define M 105 char st[M][M]; int path[M], fl[M]; int get_result(int a, int b) { int len = strlen(st[a]); for(int i = 0; i < len; i++) if(st[a][i]!=st[b][i]) return i; return len; } int main () { int t, n, ans, max; scanf("%d",&t); w... 阅读全文
posted @ 2013-03-31 11:19 Primo... 阅读(143) 评论(0) 推荐(0)