社区
数据结构与算法
帖子详情
一个整数列靠拢的问题
zeroieme
2009-11-11 02:02:12
给出一组已经排序的整数列A={a1,a2,……an},要求得到符合下面要求的整数列B={b1,b2,……bn}。
1、两数列之和相等;
2、相对的次序不变。如a1<a2,则要求b1<=b2;如a1=a2,则必须b1=b2;
3、符合1、2条件下数列B的方差最小。
(令数列相对靠拢)
假如两数列之和恰好被n整除就整个数列等于平均数,多数情况并不那么理想。
...全文
315
16
打赏
收藏
一个整数列靠拢的问题
给出一组已经排序的整数列A={a1,a2,……an},要求得到符合下面要求的整数列B={b1,b2,……bn}。 1、两数列之和相等; 2、相对的次序不变。如a1<a2,则要求b1<=b2;如a1=a2,则必须b1=b2; 3、符合1、2条件下数列B的方差最小。 (令数列相对靠拢) 假如两数列之和恰好被n整除就整个数列等于平均数,多数情况并不那么理想。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
daidodo
2009-11-13
打赏
举报
回复
mark
zeroieme
2009-11-12
打赏
举报
回复
因为实际产生数据的不可分割区较大,因而不可分割区数量减少。所以采取全循环搜索。
zeroieme
2009-11-11
打赏
举报
回复
回复#12楼
感觉上,k越小,越有可能尾项过大。
递归不能避免“剩下r-(n-fi)个1”小于最后区间(bm,fm) 的情况。
qiuzhenguang
2009-11-11
打赏
举报
回复
那就不要取k=sum(A)/n 和 r=sum(A)%n
而是取得更小一点的k值,我认为,k可以取到k=sum(A)/n-m; 其中m是前述的区间总数。(k的下限应该是可以证明的,不会小于sum(A)/n-m,但是我没证明哦)
这时r=sum(A)%n + m*n;
再用这个 r 的代替9楼的 r 去递归.
FancyMouse
2009-11-11
打赏
举报
回复
那也就是说先把相同的数收缩掉,变成ai数组,然后有个辅助的ci数组记录重数。然后尝试构造bi数组。偶们知道bi数组的平均值是定值,所以只需要最小化平方和。假设ai是严格递增的情况下,bi不严格递增,所以估计可以用dp,但要做到强多项式还是要把界给卡一下。
zeroieme
2009-11-11
打赏
举报
回复
[Quote=引用 9 楼 qiuzhenguang 的回复:]
首先统计,设有m段数字相同,第i段的起止区间下标记为(bi,fi);
那么m段区间为(b1,f1),(b2,f2),...,(bi,fi),(bm,fm)
在结果序列B中,这些区间内的数字是必须相同的,称这些区间为不可分割区,
这样,也就得到了可分割区(1,b1),(f1,b2),(f2,b3),...,(fi,bi+1),...,(fm,n);
记k=sum(A)/n,r=sum(A)%n;
(1)如果(n-r)落在可分割区,即fi <(n-r) <bi+1,那么可以得出前(n-r)个数是k,后r个数是k+1;
(2)如果(n-r)落在不可分割区,那么找出包含(n-r)的区间(bi,fi),fi前面的赋值为k,后面的赋为k+1;
这样,还剩下r-(n-fi)个1,对这些剩下的1的分配过程,其实与前面对r个1的分配过程类似:重复上述(1)(2)过程。
注:“bi+1”中(i+1)是下标。
[/Quote]
这样会使数列尾项过大,同时不一定有解。
原始数列 {2,6,6,6,6,6,6,7,7}
弱化条件2 {5,5,6,6,6,6,6,6,6}
按9楼方法 {5,5,5,5,5,5,5,8,
9
},而且方差比原始数列更大。
较好的方案{4,6,6,6,6,6,6,6,6}
qiuzhenguang
2009-11-11
打赏
举报
回复
首先统计,设有m段数字相同,第i段的起止区间下标记为(bi,fi);
那么m段区间为(b1,f1),(b2,f2),...,(bi,fi),(bm,fm)
在结果序列B中,这些区间内的数字是必须相同的,称这些区间为不可分割区,
这样,也就得到了可分割区(1,b1),(f1,b2),(f2,b3),...,(fi,bi+1),...,(fm,n);
记k=sum(A)/n,r=sum(A)%n;
(1)如果(n-r)落在可分割区,即fi<(n-r)<bi+1,那么可以得出前(n-r)个数是k,后r个数是k+1;
(2)如果(n-r)落在不可分割区,那么找出包含(n-r)的区间(bi,fi),fi前面的赋值为k,后面的赋为k+1;
这样,还剩下r-(n-fi)个1,对这些剩下的1的分配过程,其实与前面对r个1的分配过程类似:重复上述(1)(2)过程。
注:“bi+1”中(i+1)是下标。
qiuzhenguang
2009-11-11
打赏
举报
回复
解:首先,如果我们上述3个条件都考虑,但是条件2我们放弱一点:“如a1 <=a2,则要求b1 <=b2”。那么我们很容
易得到一种解法如下:求序列之和sum,设k=sum/n,r=sum%n;那么,整数列B为前(n-r)个是k,后r个是(k+1),这时它们
的方差是最小的。
其次,我们再把条件2收紧:......这个问题还要再想想。
zeroieme
2009-11-11
打赏
举报
回复
[Quote=引用 6 楼 fire_woods 的回复:]
但是刚好在不加1和加1的临界处,ak=ak+1的话,就有点麻烦,还没想好整体算法.
[/Quote]
目前最头痛的就是这个
fire_woods
2009-11-11
打赏
举报
回复
但是剛好在不加1和加1的臨界處,ak=ak+1的話,就有點麻煩,還沒想好整體算法.
fire_woods
2009-11-11
打赏
举报
回复
假設S=a1+a2+……an;
有浮點數最優解.
b1=b2= ... =bn=S/n
剩下的問題就是怎么把S-(int)(S/n)*n,分配到bi中去.
從方差的角度來講,應該是{bi}序列中最后S-(int)(S/n)*n個數加1即可.
qiuzhenguang
2009-11-11
打赏
举报
回复
提供一个可能行的思路,不知道楼主有没有学过图像处理,里面有一种方法叫做“灰度直方图均衡”,就是把图像的值尽量均匀的分散到(0,255)区间。你现在的要求不是分散,而是靠拢,应该也可以套用类似的思想。只不过要有一些逆向思维。
FancyMouse
2009-11-11
打赏
举报
回复
假设a1+a2+...+an=xn+y,y=0,1,...,n-1,那么bi如下构造。假设ai是数组里第j小的数。如果j<y那么bi=x。否则bi=x+1。
hua_zhixing_
2009-11-11
打赏
举报
回复
没大看懂题目……
绿色夹克衫
2009-11-11
打赏
举报
回复
用DP应该可以解,不过搜索范围可以先用上面的构造法得出2个近似解(大、小各一个),
然后在这个区间用DP应该可以解。
最近的研究表明我似乎只会用DP,对于大部分问题的回答是,“用DP应该可以解”
必修1全套教案.doc
集合中的元素具有唯一性,即
一个
集合内的元素不能重复出现,并且每个元素要么属于集合,要么不属于。 2. 集合的表示方法: - 自然语言:通过文字描述集合中的元素特性。 - 字母表示法:用大写字母如A, B, C等代表...
计导 课后习题参考答案(第4章.pdf
- 最左边一
列
相加后的进位通常被忽略,因为计算机通常使用补码表示有符号
整数
,最高位用于表示符号(正或负)。 4. **N位分配单位不能等于1**: - 因为1位不足以表示正负符号,无法表示完整的数值范围。 5. **...
Youngster团队第一期C语言测试题
- **解题思路**:定义
一个
函数用于比较两个数的大小,并在主函数中调用该函数。 #### 程序32:四则运算 - **知识点**:函数定义与调用。 - **解题思路**:定义多个函数分别实现加、减、乘、除四种运算,并在主函数...
戳气球leetcode-leetcode-solution:实践
戳气球 leetcode leetcode-solution ...矩阵置0(原地置,以第一行和第一
列
作为标记,同时考虑matrix[0][0]的特殊情况) 计算小于n的非负
整数
中1的个数(归纳法) 计算坐标系内两个矩形重叠后的面积之和
Visual FoxPro程序设计实习教程与习题集.doc
- `ROUND`函数可以四舍五入,当第二个参数为负时,表示向
整数
的某个位数
靠拢
,如`ROUND(12345.6789,-1)`。 - `STR`函数的默认参数设置,如`STR(3.1415926)`,会自动根据数值调整精度。 通过这些实例,学习者可以...
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章