一个数字分段的问题!~

cathong 2010-04-15 05:35:40
现在又一个数字
要大于200
分多少段不一定,但是两端的数必须是在30-35之间的一个数
之后中间是50-60之间的一个数,但是相邻的两个数不能相等。

想了好长时间都没有好办法,那位来解决下?!~~~



...全文
259 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
cathong 2010-04-22
  • 打赏
  • 举报
回复
这个不是纯数学问题,没有无解的情况
只要分的算法就行,其他的不用考虑
cathong 2010-04-19
  • 打赏
  • 举报
回复
想了好长时间了,题目有点忘了,都是口述
呵呵。。
没有别的法子了?
cathong 2010-04-16
  • 打赏
  • 举报
回复
总数不是固定的
分成多少个数也没法定,一个一个的减得话最后的余数可能会很大不符合要求还得重新分
Sunshine_sdau 2010-04-16
  • 打赏
  • 举报
回复
利用随机数生成的方式,得到相应区间的数,之后再根据一系列限制条件来筛选出想要的数列,这样可以吧我想……
cathong 2010-04-16
  • 打赏
  • 举报
回复
举例,举例
就这个意思了
doug_wang 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cathong 的回复:]

比如 200 可以分成

30 49 44 47 30

就这样分
[/Quote]
49 44 47这三个数都不是50-60之间的数
cathong 2010-04-16
  • 打赏
  • 举报
回复
比如 200 可以分成

30 49 44 47 30

就这样分
chongyou520 2010-04-16
  • 打赏
  • 举报
回复
楼主 你能不能一次性的把题目要求说完啊? 啊???
yyfhz 2010-04-16
  • 打赏
  • 举报
回复
由于56.15这个值既不是中间元素的下限,也不是中间元素的上限,因此将中间元素两个两个进行分组,
35, (56.15, 56.15), (56.15, 56.15), (56.15, 56.15), (56.15, 56.15), (56.15, 56.15), (56.15, 56.15), (56.15), 35
并给每一个分组的第1个元素加上一个足够小的正向偏移,而给第2个元素加上同样大小的负向偏移,如果最后一组只有1个元素,则不调整。
关于这个偏移量的大小,可以通过比较平均值和上下限之间的差异来得到。这里比较的是abs(56.15-50)=6.15, abs(56.15-60)=3.85,因此这个差异只要<3.85就可以了。
这里取偏移量为1,最后的结果就是
35, (55.15, 57.15), (55.15, 57.15), (55.15, 57.15), (55.15, 57.15), (55.15, 57.15), (55.15, 57.15), (56.15), 35
================================================================
这个也简单,两两分组后,每一组取得偏移量不一样就可以了。
比如每1组的偏移量都是前一组偏移量除以2,第1组偏移量仍然取1,最后的结果就是
35, (55.15, 57.15), (55.65, 56.65), (55.9, 56.4), (56.025, 56.275), (56.0875, 56.2125), (56.11875, 56.18125), (56.15), 35
cathong 2010-04-16
  • 打赏
  • 举报
回复
还有一个条件是从中心开始不能两边对称
yyfhz 2010-04-16
  • 打赏
  • 举报
回复
那么就简单了,其实根据上面的算式,
60+(n-2)*50<T<70+(n-2)*60
只要当上下限的差异>=50之后,就会一直有解了(最简单的一种想法是,在一个n下把元素值不停的提升上去,一旦超过了上限就n+1,再从底下开始算起)
根据不等式
(70+(n-2)*60) - (60+(n-2)*50) >=50
解出n>=6。
而n=6时,T的下限为 60+(6-2)*50 = 260,因此对于所有>260的数,始终有解。
cathong 2010-04-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yyfhz 的回复:]

如果分段的内容可以允许是实数的话,可以用简单的方法进行可行性判断以及进行求解
算术模型是
=======================================
x[0]+x[1]+...+x[n]=T
a[i]<=x[i]<=b[i]
x[i]<>x[i+1]
=======================================
可以解出
a[0]+a[1]+……
[/Quote]

这个厉害了,我看看得

那个210的问题是这样的,如果遇到这样的问题这个数是可以例外的,比如可以相邻的数相等,也可以两段的数更改,这个是特例。只是想看下大部分数如果这样分的话有没有算法
yyfhz 2010-04-16
  • 打赏
  • 举报
回复
如果分段的内容可以允许是实数的话,可以用简单的方法进行可行性判断以及进行求解
算术模型是
=======================================
x[0]+x[1]+...+x[n]=T
a[i]<=x[i]<=b[i]
x[i]<>x[i+1]
=======================================
可以解出
a[0]+a[1]+...+a[n]<=T<=b[0]+b[1]+...+b[n]
=======================================
对于本题,有
a[0]=a[n]=30, b[0]=b[n]=35
a[1]=...=a[n-1]=50
b[1]=...=b[n-1]=60
n>3
=======================================
可以解出
30+30+(n-2)*50<=T<=35+35+(n-2)*60
由于 x[1]... x[n-1]不可能全部相同,因此x[1]...x[n-1]不可能全为50, 也不可能全为60,因此
30+30+(n-2)*50<T<35+35+(n-2)*60,即
60+(n-2)*50<T<70+(n-2)*60
=======================================

例如当T=210时,有
60+(n-2)*50<210以及70+(n-2)*60>210,解得
4.333<n<5。由于4.333与5之间不包含整数,故无解。

=======================================
对于有解的情况,比如说T=800,可以算出
60+(n-2)*50<800以及70+(n-2)*60>800
即14.17<n<16.8,这其中包含了15,16两个整数,可任意取一个整数进行求解。比方说取n=15。
=======================================
可以计算得出,当n=15时,最大的取数据范围是
60+(15-2)*50 ~ 70+(15-2)*60 即710~850之间
现在需要的值是800,可以求出每一个数据离各自下限的平均距离,这里就是(800-710)/15=6。
由于6>35-30,这表明如果对每一个值都从其下限开始增加相同的长度的话,首尾两个元素会超过允许上限,因此在此对首尾元素直接取上限35。
于是其他元素的平均值就变成了(800-35-35)/(15-2)=56.15。
此时的序列为
35, 56.15, 56.15, 56.15, 56.15, 56.15, 56.15, 56.15, 56.15, 56.15, 56.15, 56.15, 56.15, 56.15, 35
由于56.15这个值既不是中间元素的下限,也不是中间元素的上限,因此将中间元素两个两个进行分组,
35, (56.15, 56.15), (56.15, 56.15), (56.15, 56.15), (56.15, 56.15), (56.15, 56.15), (56.15, 56.15), (56.15), 35
并给每一个分组的第1个元素加上一个足够小的正向偏移,而给第2个元素加上同样大小的负向偏移,如果最后一组只有1个元素,则不调整。
关于这个偏移量的大小,可以通过比较平均值和上下限之间的差异来得到。这里比较的是abs(56.15-50)=6.15, abs(56.15-60)=3.85,因此这个差异只要<3.85就可以了。
这里取偏移量为1,最后的结果就是
35, (55.15, 57.15), (55.15, 57.15), (55.15, 57.15), (55.15, 57.15), (55.15, 57.15), (55.15, 57.15), (56.15), 35


chongyou520 2010-04-16
  • 打赏
  • 举报
回复
L楼主的题目说是 中间的数是50——60 而且要求大于200 你肯定记错题目了、
我举一个列
210
无论你怎么样分都达不了标。
cathong 2010-04-16
  • 打赏
  • 举报
回复
这个用过
实现很麻烦,因为中间相邻的两个数是不能重复的很难加成正好的
hui135 2010-04-16
  • 打赏
  • 举报
回复
两端最大是35,看错了。
hui135 2010-04-16
  • 打赏
  • 举报
回复
按最极端的办法,先将要分的这个数(比如180)减去两端的最小数30*2=120;再用120/50=2.4,取整为2,中间就分两端,检查在50-60这间不,大于60就,分点(比如2,每端加1)给两端,就变成了31,59,59,31,再分1给一端,变成32,58,59,31。

中间分段的技巧在于最多的段数:两端都是最小30,中间都是最小50,
最少的段数:两端都是最大40,中间都是最大60,
这样结果的段数必定在最大段数和最小段数之间,从段数最小的情况,慢慢改变各段的值,看是否能分得满足要求。否则这个数就不能按照要求分出来。
luozhangwen 2010-04-15
  • 打赏
  • 举报
回复
题目没看懂,

50,504

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧