摘要:
链接:http://codeforces.com/contest/370/problem/C题意:有n双手袜(1n/2,则不能令所有袜子所有手颜色不同。输出方案是,maxc的颜色选一个,其他颜色选一个,组成一双。注意一双手袜拆分成一个左手手袜,一个右手手袜,位置不一样。最后剩余的是maxc颜色的袜子,直接输出。若maxc2#include3usingnamespacestd;45constintN=5005;6constintM=105;78intmain()9{10intn,m,a[M],c,maxc,ans[2*N],indexa,finalAns[2*N];11cin>>n& 阅读全文
摘要:
题意:有一面h*w的墙(02#include3#include4#include5usingnamespacestd;67constintM=10005;8constintN=105;910structRec11{12inttop,left,bottom,right,color;13}rec[N];14intY[2*N],X[2*N],aa[2*N][2*N],ans[N],indexx,indexy,xx,yy;1516intmain()17{18intCase=1;19inth,w,n,top,left,bottom,right;20while(scanf("%d%d" 阅读全文
摘要:
题目链接:http://poj.org/problem?id=2831题意:题目大意:给张图,然后问你,如果某边的权值下降为V,那么这个边有无可能在最小生成树中呢?节点数≤1000,边数≤100000,询问数≤100000。思路:prim。考虑prim的算法过程:每次加入一个点,并且加入该点的条件是dis[i]是还没加入点的dis[]中最小的。所以执行prim时,用数组no[]保存某点加入的次序,numm[i]保存第i个加入的点的id查询边(a,b)时(假设a的加入次序先于b),则枚举no[a]+1 ~ no[b]加入的点的dis[],若存在x2#include3#include4#inclu 阅读全文
摘要:
复习。借图= =n个点,给出两两点之间的距离,求最小生成树的边长度之和。稠密图,用prim。1#include2#include3#include4#include5usingnamespacestd;67constdoublemaxd=1000001;8constintN=105;910doublex[N],y[N];11doublemap1[N][N],dis[N];12intvis[N];1314doublecal(inti,intj)15{16doubleret=(y[i]-y[j])*(y[i]-y[j])+(x[i]-x[j])*(x[i]-x[j]);17returnsqrt(r 阅读全文
摘要:
题目链接:http://poj.org/problem?id=2853题意:某些正整数可由几个连续数相加而成,且方法可能有多种,如3 = 1 + 2, 9 = 4 + 5 = 2 + 3 + 4给出任意小于2^31的正整数,问有多少种方法。思路:其实就是关于公差为1的等差数列的问题。由 num = (a1 + an) * n / 2, an = a1 + n - 1可以得到令 k = 2 * num / n则a1 = (k - n + 1) / 2, an = (k + n - 1)所以枚举sqrt(2 * num) 的所有因子,每一组因子中小的为n,大的为k求出对应的a1,an,若满足大于0 阅读全文
摘要:
引用byvoid大神的解释:树状数组是一个优美小巧的数据结构,在很多时候可以代替线段树。一句话概括就是,凡是树状数组可以解决的问题,线段树都可以解决,反过来线段树可以解决的问题,树状数组不一定能解决。树状数组英文名称为Binary Index Tree,直译过来就是二进制索引树,我觉得二进制索引树更能说明其本质。树状数组的本质就是一种通过二进制位来维护一个序列前i和的数据结构。对于维护的序列A,定义C[i]=A[j+1]+...+A[i],其中j为i的二进制表示中把最右边的1换成0的值。j的值可以通过lowbit求出,即i-lowbit(i)。lowbit(a)为2^(a的二进制表示末尾0的个 阅读全文
摘要:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1297题意:求n个人排成一列的方案数,其中男女数量无规定,但是女生至少要两个站在一起。思路:由于有男生和女生,所以n个人排成一列共有2^n种方案。可将这2^n种方案分为合法序列和非合法序列,并设合法序列方案数为F(n)。要注意,每增加一个人,总方案数会变成原来的两倍。我们可以想像n-1个人的所有可能的序列已经排好,增加一个人就是在原来排好的序列的末尾加上一个男生或一个女生。有人会问:为什么只在末尾加,在前面加人不可以吗?其实在前在后加都是一样的,n-1个人排成的序列有2^n-1种,n个人排成的序列有 阅读全文
摘要:
求浮点数的幂(02#include3#include4#include5#include6usingnamespacestd;78#defineMAXN99999#defineMAXSIZE1010#defineDLEN41112classBigNum13{14private:15inta[500];//可以控制大数的位数16intlen;//大数长度17public:18BigNum(){len=1;memset(a,0,sizeof(a));}//构造函数19BigNum(constint);//将一个int类型的变量转化为大数20BigNum(constchar*);//将一个字符串类型 阅读全文
摘要:
http://blog.csdn.net/l04205613/article/details/5829179思路是借鉴网上一大牛的,写的很完美了,所以一句没改,代码是自己敲的,C语言版变体汉诺塔 问题描述:在经典汉诺塔的基础上加一个条件,即,如果再加一根柱子(即现在有四根柱子a,b,c,d),计算将n个盘从第一根柱子(a)全部移到最后一根柱子(d)上所需的最少步数,当然,也不能够出现大的盘子放在小的盘子上面。注:12#include3#defineM10000045longlongans[70];67intmain()8{9intn;10ans[1]=1;11ans[2]=3;12ans[3] 阅读全文
摘要:
C.Matrix题意:输入a和s。s是只包含数字的字符串,b是一个矩阵,矩阵内的元素满足bij=si*sj。查找有多少个子矩阵,能满足这个子矩阵内的所有元素和为a。思路:注意一点:子矩阵的横坐标、纵坐标上的数分别为(x,y,z,...)、(a,b,c,...),则子矩阵内元素和等于(a+b+c+...) * (x+y+z+...)。由这点可将问题转化为求有多少种情况,令m*n==a。而m、n来自s的子串内digit之和。因此枚举s的所有连续子串,保存下所有子串内digit和及个数。当a不等于0时,枚举a的因子。当a等于0时,只考虑num[0]。PS:重复计算的情况为当横纵两数相等时。参考:ht 阅读全文