摘要:用cin居然比scanf效率低了10倍,真有点不可思议。。。。。#include<stdio.h>#include<string.h>int N;int number[5100];int dp[5100];int max(int a,int b){return a>b?a:b;}int main(){ int T; scanf("%d",&T); while(T--) { int i,j; scanf("%d",&N); for(i=1;i<=N*(N+1)/2;i++) { scanf("%
阅读全文
摘要:题目分析转自:http://www.cnblogs.com/sdjl/articles/1281607.html此题解析如下:1、过程很明显,就是合并珠子的过程,从一串珠子共n颗开始,每次合并相邻的两颗为一颗,直到剩下一颗为止。2、过程的最后一个步骤是把两颗珠子进行合并,这两颗珠子可以这样考虑,其中一颗是连续的r颗合并得到的,另一颗是其余的n-r颗连续的珠子合并得到的,那么选择就是这个r颗连续的珠子如何选取,以顺时针选取考虑每颗珠子开头的情况,共有n种选择。3、子问题是选择的这r颗连续的珠子最多能够得到多少能量,以及另外n-r颗连续的珠子最多能够得到多少能量,如果子问题能够得到最优的值,那么母
阅读全文
摘要:哎,折磨死人的dp题,反正对于我来说是的,看了其他大牛们的代码过的,惭愧。。。。。#include<stdio.h>#include<string.h>int n,t,q;int skillCost[110];int skillhurt[110];int dp[110];//dp[i][j]表示第i轮攻击,boss还剩下j滴hp时候剩下的最大mpint max(int a,int b){ return a>b?a:b;}int main(){ while(scanf("%d%d%d",&n,&t,&q)) { if(n=
阅读全文
摘要:转自:http://zc634579757.blog.163.com/blog/static/1244974622009716104841721/这题真是让我看到了位运算和状压DP的神奇之处! 这题就是用一个二进制数保存一个集合的元素 比如一个集合中有两个元素 1 3 那就用5 (101)表示这个集合就是用0 1 来表示这个集合中一个数存不存在 再比如 一个集合有三个元素 1 4 5 就在这几个位子上标为1,那就用25 (11001)来表示这个集合!在借助于位运算的或( | )就可已达到合并集合的目的,比如一个集合(14 )和一个集合(1 2 3)进行合并 那就是 (9)1001 | 111(
阅读全文
摘要:快速幂取模算法,留着以后慢慢研究long long modExp(long long a,long long b,long long n){ long long t,y; t = 1; y = a; while(b){ if(b % 2) t = t * y % n; y = y * y % n; b >>= 1; } return t;}
阅读全文
摘要:<code>#include<stdio.h>__int64 n;__int64 prime[1000000];int main(){ __int64 i,j; __int64 locate=0; for(i=2;i<1000000;i++) { if(prime[i]==0) { locate++; for(j=i;j<1000000;j+=i) { prime[j]=locate; } } } while(scanf("%I64d",&n)!=EOF) { printf("%I64d\n",prime[n]
阅读全文
摘要:转自:http://blog.sina.com.cn/s/blog_787c1f7b0100s0yx.html参考链接:http://leonbule.blogbus.com/logs/5342169.htmlhttp://kmplayer.javaeye.com/blog/606352原理:1. 任何一个合数都可以表示成一个质数和一个数的乘积2. 假设A是一个合数,且A = x * y,这里x也是一个合数,那么有:A = x * y; (假设y质数,x合数)x = a * b; (假设a是质数,且a < x)-> A = a * b * y = a * Z (Z = b * y)
阅读全文
摘要:这道题看起来很吓人,数据量也很大,其实是有技巧的,最后一位就是N对10取模以后的N次方的最后一位,有10中可能,即从0到9,而观察可以发现,0到9这10个数不断的与自己相乘,最后一位是有周期的,下面的就很简单了#include<iostream>using namespace std;long long N;int main(){ int T; cin>>T; while(T--) { cin>>N; if(N==0||N%10==1) { cout<<1<<endl; continue; } int mod=N%10; if(mod
阅读全文
摘要:文章作者:ktyanny文章来源:ktyanny转载请注明,谢谢合作。 按位异或运算俗称:xor运算1、xor的基本知识我们来看看xor运算的机理:1001011001011----àaxor 1011010001110----àb------------------------- 0010001000101---àc看了上面的式子,体会到异或运算的原理了吧,就是:0和1异或0都不变,异或1则取反。很容易理解,如果b中的某位为1,那么a xor b 的作用是在a相应的位进行取反操作。用通俗易懂的语言来讲就是xor运算通常用于对二进制的特定一位进行取反操作。我们再看
阅读全文
摘要:文章作者:ktyanny文章来源:ktyanny转载请注明,谢谢合作。 由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。按位与(Bitwise AND),运算符号为&a&b 的操作的结果:a、b中对应位同时为1,则对应结果位也为1、例如:10010001101000101011001111000& 111111100000000 --------------------------------------------- 10101100000000对10101100000000进行右移8位得到的是101011,这就得到了a的8~15位的掩码了。那
阅读全文
摘要:这道题主要考察的是枚举算法#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
阅读全文
摘要:C++ String 的用法C++ string: 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。首先,为了在我们的程序中使用string类型,我们必须包含头文件 <string>。如下:#include <string> //注意这里不是string.h string.h是C字符串
阅读全文
摘要:来自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;(这个相信大家
阅读全文
摘要:刚开始做这题时,感觉水题啊,于是直接开了个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与任何数异或都等于他本身 //任何数与
阅读全文
摘要:关于放苹果的那些事。。。。。。。。。。 今天偶然看到一个关于整数划分的算法, 仔细看了后,我想到了放苹果的事,其实这个问题困扰了我很久,一直没想明白放苹果的原理。记得当时做这个题的时候,自己的分析的方法和整数划分的算法是一样的,就是没想到用递归就能做出来,看了一位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种。下面介绍一种通
阅读全文
摘要:一看这道题,确实没有思路,数据范围那么大,根本就没法做……后来,看到了一个人的分析,是这样转换的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
阅读全文
摘要:转帖:http://blog.csdn.net/anchor89/archive/2010/09/29/5913246.aspx最开始的思路很简单,设一个循环变量从1-n,依次乘到累乘变量s中,只保留s的最后几位非零数字,结果hll的错了,原因主要有两个:1是速度慢,2是在乘的过程中会碰到5的倍数,而每乘一个5的倍数,末尾就会产生一个零,为了保持最后几位都是非零数字,就需要整体右移,这样一来最高位的数字就变得不精确,经过多次右移后,s就完全不是精确的结果了,当然没法得到答案. 这个思路被断掉后一时没了想法,最后多亏老马的提示:末尾0产生的原因是乘式中有2*5这样的因子,因此在计算的时候就该先将
阅读全文
摘要:本题思路很简单:就是用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=
阅读全文
摘要:将二维的动态规划问题转话为一维的动态规划问题#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
阅读全文
摘要:#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
阅读全文
摘要:#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 ==
阅读全文