上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 30 下一页
  2012年10月18日
摘要: 大意:给你一个数字N,L,R,求数字M(L<=M<=R)使得N|M的值最大。思路:将数字用二进制表示,从高到低枚举32位,采用贪心的思想。CODE:#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>usingnamespacestd;#defineMAXN1001longlongten2b[MAXN];longlongMbit[MAXN];longlongtot;voidchange(longlongn){w 阅读全文
posted @ 2012-10-18 11:12 有间博客 阅读(204) 评论(0) 推荐(0) 编辑
  2012年10月17日
摘要: 大意:给你一个数字A,让你求最小的数字使得该数字各个数字的积为A。思路:觉得是一道数论题,只要让A的因子从小到大产生,DFS可以过,其余的不知道。1、首位是不能为1的,1x任何数等于任何数,而且又使数字增加了10倍,不是最小的。2、枚举A因子的总数。CODE:#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>usingnamespacestd;#defineMAXN110intfac[MAXN],num[MAXN];intn,tot;intflag;voidin 阅读全文
posted @ 2012-10-17 21:50 有间博客 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 大意:给你一段水平的距离,以及蚂蚁相对于最左边的距离,蚂蚁行走的方向不确定,一旦所有的蚂蚁都走出了这一段水平距离的话,让你求出可能的最小与最大时间。思路:最小时间非常好求,主要的问题是求最大的时间,我们可以将问题转换为等价问题,即蚂蚁碰到之后然后反方向行走相当于一直前进,这个问题可以手写模拟一遍,发现行走的距离总是相等的。问题衍生一下,如果有的蚂蚁的速度是1cm/s,而有的蚂蚁是2cm/s呢?那怎么去求?我想这个问题应该按照dis/v来比较大小了吧。CODE:#include<cstdio>#include<cstdlib>#include<iostream> 阅读全文
posted @ 2012-10-17 10:21 有间博客 阅读(137) 评论(0) 推荐(0) 编辑
  2012年10月16日
摘要: 大意:给定一串(|X1-A| + |X2-A| + … … + |Xn-A|) ,让你求一个值A使得此表达式最小。思路:见附件,从概率的角度证明了这个数一定是中位数,如果n是奇数,A一定只有一个,否则可以取a[q],a[q+1]闭区间之间的任何数。关于中位数定理的一个概率证明(点击下载附件)CODE:#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>#include<algorithm>usingnamespacestd;#defineMAXN100 阅读全文
posted @ 2012-10-16 21:52 有间博客 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 题意:按顺序给你N个数,将这N个数分成连续的M段,使得这M段每段的和中的最大值最小,输出最小值(1<=N<=100000,1<=M<=N,每个数在1到10000之间),如果有多种可能的话,尽量在前面进行划分。思路:1、由于函数具有单调性的特征,因此可以用二分枚举的办法去实现它,这与POJ3258有非常相似的地方,但这里不需要排序。2、输出的时候需要用到贪心的思想,既尽量往前划分。3、大概的思路就是二分枚举求得满足题意的最大值之后,然后以这个最大值通过从后往前的方式划分成段,如果剩余可划分段与i+1的值相等(尽量靠前),则将剩余的段往前划分,具体实现可以用一个标记数组us 阅读全文
posted @ 2012-10-16 20:30 有间博客 阅读(365) 评论(0) 推荐(0) 编辑
摘要: 题意:按顺序给你N个数,将这N个数分成连续的M段,使得这M段每段的和中的最大值最小,输出最小值(1<=N<=100000,1<=M<=N,每个数在1到10000之间),如果有多种可能的话,尽量在前面进行划分。思路:1、由于函数具有单调性的特征,因此可以用二分枚举的办法去实现它,这与POJ3258有非常相似的地方,但这里不需要排序。2、输出的时候需要用到贪心的思想,既尽量往前划分。3、大概的思路就是二分枚举求得满足题意的最大值之后,然后以这个最大值通过从后往前的方式划分成段,如果剩余可划分段与i+1的值相等(尽量靠前),则将剩余的段往前划分,具体实现可以用一个标记数组us 阅读全文
posted @ 2012-10-16 20:28 有间博客 阅读(1133) 评论(0) 推荐(0) 编辑
摘要: 手推可以得到一定是先+后x的积最大,反之最小,然后模拟一遍即可,我的代码比较cuo,于是借鉴了别人用栈模拟优先级的代码,模仿才有创新。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>#include<stack>usingnamespacestd;stack<longlong>Max;stack<longlong>Min;v 阅读全文
posted @ 2012-10-16 16:12 有间博客 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 大意:让你按照某一顺序使得给定的数字的和最小。思路:贪心性质可以被证明,见刘汝佳白书P156,可以用哈夫曼树来做,我用的是优先队列。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<algorithm>#include<cstdio>#include<queue>usingnamespacestd;#defineMAXN5010intn;inta[MAXN],sum[MAXN];structcmp{booloperator()(constin 阅读全文
posted @ 2012-10-16 11:09 有间博客 阅读(207) 评论(0) 推荐(0) 编辑
  2012年10月15日
摘要: 大意:数轴上有n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定的线段[s,t]。思路:贪心,具体见刘汝佳白书P154。把各区间按照a从小到大排序。如果区间1的起点不是s,无解,否则选择起点在s的最长区间。选择此区间[ai,bi]后,新的起点设置为bi,然后经过依次扫描之后就可以得出最小的线段数。并用另一个结构体储存路径。另外:排序可有可无,有了只不过是一种优化措施,没有排序的话程序也对,最主要的算法还是贪心。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<algo 阅读全文
posted @ 2012-10-15 21:50 有间博客 阅读(776) 评论(0) 推荐(0) 编辑
摘要: 贪心,用到了许多小技巧,向下取整等。CODE:#include<iostream>#include<cstdlib>#include<cstring>#include<cstdio>usingnamespacestd;intu[4]={0,5,3,1};//以三的剩余个数进行分类intmain(){intone,two,three,four,five,six;while(scanf("%d%d%d%d%d%d",&one,&two,&three,&four,&five,&six) 阅读全文
posted @ 2012-10-15 19:53 有间博客 阅读(195) 评论(0) 推荐(0) 编辑
上一页 1 ··· 4 5 6 7 8 9 10 11 12 ··· 30 下一页