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) 编辑