2011年5月22日

位运算 之(2) 按位异或(xor)^ 操作

摘要: 文章作者:ktyanny文章来源:ktyanny转载请注明,谢谢合作。 按位异或运算俗称:xor运算1、xor的基本知识我们来看看xor运算的机理:1001011001011----àaxor 1011010001110----àb------------------------- 0010001000101---àc看了上面的式子,体会到异或运算的原理了吧,就是:0和1异或0都不变,异或1则取反。很容易理解,如果b中的某位为1,那么a xor b 的作用是在a相应的位进行取反操作。用通俗易懂的语言来讲就是xor运算通常用于对二进制的特定一位进行取反操作。我们再看 阅读全文

posted @ 2011-05-22 22:46 lonelycatcher 阅读(863) 评论(0) 推荐(0) 编辑

位运算 之(1) 按位与(AND)& 操作

摘要: 文章作者:ktyanny文章来源:ktyanny转载请注明,谢谢合作。 由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。按位与(Bitwise AND),运算符号为&a&b 的操作的结果:a、b中对应位同时为1,则对应结果位也为1、例如:10010001101000101011001111000& 111111100000000 --------------------------------------------- 10101100000000对10101100000000进行右移8位得到的是101011,这就得到了a的8~15位的掩码了。那 阅读全文

posted @ 2011-05-22 22:45 lonelycatcher 阅读(1001) 评论(0) 推荐(0) 编辑

POJ 2811 熄灯问题

摘要: 这道题主要考察的是枚举算法#include<iostream>#include<string.h>usingnamespace std;int N;int map[7][8];int orignal[7][8];int pre[7][8];int sequence[7];voidpress(int i,int j)//按下坐标为 (i,j)的按钮{ map[i][j]=(map[i][j]+1)%2; map[i-1][j]=(map[i-1][j]+1)%2; map[i+1][j]=(map[i+1][j]+1)%2; map[i][j-1]=(map[i][j-1 阅读全文

posted @ 2011-05-22 22:36 lonelycatcher 阅读(714) 评论(0) 推荐(0) 编辑

C++中标准string类的用法

摘要: C++ String 的用法C++ string: 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。首先,为了在我们的程序中使用string类型,我们必须包含头文件 <string>。如下:#include <string> //注意这里不是string.h string.h是C字符串 阅读全文

posted @ 2011-05-22 22:24 lonelycatcher 阅读(364) 评论(0) 推荐(0) 编辑

异或位运算

摘要: 来自Lvsi‘s home 以前一直忽视了异或这些小运算,今天做到HDU的2095时才发现异或的功能,这里只讲它的一小部分; 异或时一种逻辑运算,它的真值表如下 1 ^ 1 == 0; 1 ^ 0 == 1; 0 ^ 1 == 1; 0 ^ 0 == 0; 异或实质上是将参与运算的两个数据,按对应的二进制逐位进行逻辑异或运算,只有当对应位的二进制数互斥时对应为的结果才为真; 下面介绍异或运算的几种性质: 1 交换律:a ^ b ^ c = a ^ c ^ b;(很多人忽视的性质,杭电2095就是利用这个性质做的,再小菜鸟的博客里面有 ); 2 结合律:a ^ b = b ^ a;(这个相信大家 阅读全文

posted @ 2011-05-22 22:23 lonelycatcher 阅读(1714) 评论(0) 推荐(0) 编辑

HDU 2095 find your present(异或位运算)

摘要: 刚开始做这题时,感觉水题啊,于是直接开了个1000000大小的数组,结果无情的memory limit exceed ,上网查了查大牛们的代码,真是很NB,感觉自己还很弱,还有很长的路要走啊#include<stdio.h>int N;int main(){ while(scanf("%d",&N)) { if(N==0)break; int orignal=0; int num; while(N--) { scanf("%d",&num); orignal=orignal^num;//0与任何数异或都等于他本身 //任何数与 阅读全文

posted @ 2011-05-22 22:22 lonelycatcher 阅读(244) 评论(0) 推荐(0) 编辑

整数划分

摘要: 关于放苹果的那些事。。。。。。。。。。 今天偶然看到一个关于整数划分的算法, 仔细看了后,我想到了放苹果的事,其实这个问题困扰了我很久,一直没想明白放苹果的原理。记得当时做这个题的时候,自己的分析的方法和整数划分的算法是一样的,就是没想到用递归就能做出来,看了一位dn的博客,终于明白是怎么回事了.........例子,整数划分的思想如下:整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n。如6的整数划分为 65+14+2,4+1+13+3,3+2+1,3+1+1+12+2+2,2+2+1+1,2+1+1+1+11+1+1+1+1+1 共11种。下面介绍一种通 阅读全文

posted @ 2011-05-22 22:21 lonelycatcher 阅读(410) 评论(0) 推荐(0) 编辑

HDU 1060 Leftmost Digit

摘要: 一看这道题,确实没有思路,数据范围那么大,根本就没法做……后来,看到了一个人的分析,是这样转换的m=n^n;两边同取对数,得到,log10(m)=n*log10(n);再得到,m=10^(n*log10(n));然后,对于10的整数次幂,第一位是1,所以,第一位数取决于n*log10(n)的小数部分总之,log很强大啊,在求一个数的位数上,在将大整数化成范围内的整数上,在指数问题上#include <iostream>#include<math.h>using namespace std;int T;double a;long long b;double c;long 阅读全文

posted @ 2011-05-22 22:19 lonelycatcher 阅读(265) 评论(0) 推荐(0) 编辑

HDU 1066阶乘最后一个非零位

摘要: 转帖:http://blog.csdn.net/anchor89/archive/2010/09/29/5913246.aspx最开始的思路很简单,设一个循环变量从1-n,依次乘到累乘变量s中,只保留s的最后几位非零数字,结果hll的错了,原因主要有两个:1是速度慢,2是在乘的过程中会碰到5的倍数,而每乘一个5的倍数,末尾就会产生一个零,为了保持最后几位都是非零数字,就需要整体右移,这样一来最高位的数字就变得不精确,经过多次右移后,s就完全不是精确的结果了,当然没法得到答案. 这个思路被断掉后一时没了想法,最后多亏老马的提示:末尾0产生的原因是乘式中有2*5这样的因子,因此在计算的时候就该先将 阅读全文

posted @ 2011-05-22 22:16 lonelycatcher 阅读(3841) 评论(0) 推荐(2) 编辑

HDU 1058 humble numbers

摘要: 本题思路很简单:就是用2,3,5,7循环来求第i个hum[i],第i个hum[i]必定等于前i-1个数中其中一个数与{2,3,5,7}中其中一个的乘积,于是答案就出来了~~#include<iostream>using namespace std;long long humble[5843];int prime[4]={2,3,5,7};int N;int main(){ int i,j,k; humble[0]=1; humble[1]=1; //humble[1]=1; for(i=2;i<=5842;i++) { humble[i]=3000000000; for(j= 阅读全文

posted @ 2011-05-22 22:14 lonelycatcher 阅读(731) 评论(0) 推荐(0) 编辑

HDU 1081 to the max

摘要: 将二维的动态规划问题转话为一维的动态规划问题#include <iostream>#include<string.h>using namespace std;int sequence[110][110];int N;int main(){ while(cin>>N) { int i,j,k; int data; int ans=-9999; for(i=1;i<=N;i++) { for(j=1;j<=N;j++) { cin>>data; sequence[i][j]=sequence[i][j-1]+data;//sequence 阅读全文

posted @ 2011-05-22 22:13 lonelycatcher 阅读(196) 评论(0) 推荐(0) 编辑

POJ 3264线段树的应用

摘要: #include<stdio.h>#include<string.h>struct node{ int max; int min; int l; int r;};node tree[200000];int h[50005];int max,min;int MAX(int a,int b){ if(a>b) return a; return b;}int MIN(int a,int b){ if(a>b) {return b;} return a;}void build(int l,int r,int root){ tree[root].l=l; tree[r 阅读全文

posted @ 2011-05-22 22:11 lonelycatcher 阅读(213) 评论(0) 推荐(0) 编辑

HDU 1754 I hate it 线段树的应用

摘要: #include<stdio.h>#define N_MAX 200010typedef struct { int left,right; int maxScore;}seg_tree;seg_tree trees[N_MAX*4 +1];int score[N_MAX+10];int get_max(int x,int y){ return x>y?x:y;}void build_tree(int root,int left,int right){ trees[root].left = left; trees[root].right = right; if(left == 阅读全文

posted @ 2011-05-22 22:01 lonelycatcher 阅读(169) 评论(0) 推荐(0) 编辑

导航