找回密码
 加入
搜索
查看: 1201|回复: 18

讨论一个题目的思路

[复制链接]
发表于 2025-8-15 21:36:20 | 显示全部楼层 |阅读模式
前几天有个中学生的编程比赛,看了10道题目,只会两三道吧,自认为会写代码,也仅仅是浅显的逻辑,对于有深度的算法问题,才发现脑袋蠢笨至极。


下面是一道题目的其中一个小题,简单描述如下:
N个数,取大于a,或者加和大于a的所有的组合。
其中的N和a,我们可以具体化,比如:N=5,a=13。5个数:7 5 9 6 1,取和大于13的所有最小组合,所谓最小组合,已经大于13的组合,没必要继续添加元素,例如 7 5 9即可,7 5 9 6就不需要了。
题目对算力有要求的,运行时间越短得分越高。
题目要的是算法,对于所有的N和a都适用,不是仅对于具体化之后的一组数。

加和>13的组合:
7 9
7 6 1
7 5 9
7 5 6
5 9
9 6
我觉得思考起来还是有点难度的,请各位大佬展开思路来试试水。当然不要借助于AI,否则没什么意思了。


发表于 2025-8-15 22:47:49 | 显示全部楼层
精神上支持发哥!加油!
发表于 2025-8-16 20:26:43 | 显示全部楼层
不懂,提供个思路:
1.排序,将$b[N-1]由小到大排序
2.for $i1=0 to N-1,提取$b[$i1]并判断,当$b[$i1]>$a时中止循环,此时$b[$i1]即为符合要求的单个值,_arrayadd添加到到二维数组$bnew
3.for $i2=0 to N-1-$i2,提取$b[$i2]+$b[$i2+1],当>$a时中止循环,此时$b[$i2]+$b[$i2+1]即为符合要求的两个值的和他们的和,_arrayadd添加这两个值和这两个值的和到二维$bnew第一列和第二列
4.重复以上步骤,得到符合要求的N个值和他们的和,_arrayadd添加到二维数组$bnew
5._arraymin($bnew)提取出第二列最小值,用这个值再提取出$bnew中第一列值,所得到的所有值即为题中符合要求的大于$a的最小数值组合

用了大量加的计算,估计比较费资源...
发表于 2025-8-16 20:29:10 | 显示全部楼层
不太清楚题目的要求。。。例子中的答案是什么,有几种组合,如有说明就知道题目是几个意思了
发表于 2025-8-16 22:23:50 | 显示全部楼层
afan 发表于 2025-8-16 20:29
不太清楚题目的要求。。。例子中的答案是什么,有几种组合,如有说明就知道题目是几个意思了 ...

我的理解是在N个值中找到大于a的最小的数或相加组合...


二○二五年八月十六日
 楼主| 发表于 2025-8-16 22:29:05 | 显示全部楼层
afan 发表于 2025-8-16 20:29
不太清楚题目的要求。。。例子中的答案是什么,有几种组合,如有说明就知道题目是几个意思了 ...

a版,已补充答案
发表于 2025-8-16 23:40:00 | 显示全部楼层

我给的思路咋样?


二○二五年八月十六日
发表于 2025-8-17 09:51:36 | 显示全部楼层
本帖最后由 afan 于 2025-8-17 16:42 编辑

用编程确实麻烦,几个循环结果还是少了……


后用udf _array com xxx 先组合再判断,比自己写循环相对简单多了~



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +40 收起 理由
vigiles + 40 很给力!

查看全部评分

 楼主| 发表于 2025-8-17 12:58:01 | 显示全部楼层

我感觉有点bug
发表于 2025-8-17 13:10:45 | 显示全部楼层

哪?


二○二五年八月十七日
 楼主| 发表于 2025-8-17 13:16:55 | 显示全部楼层

第3步感觉不严谨
发表于 2025-8-17 13:27:06 | 显示全部楼层

咋不严谨了?


二○二五年八月十七日
 楼主| 发表于 2025-8-17 13:35:20 | 显示全部楼层

就是有遗漏,不能包含所有的组合,你写个代码试试
发表于 2025-8-17 13:48:17 | 显示全部楼层
haijie1223 发表于 2025-8-17 13:35
就是有遗漏,不能包含所有的组合,你写个代码试试

哪有遗漏?

我要会写代码还说啊...
发表于 2025-8-17 14:52:31 | 显示全部楼层
haijie1223 发表于 2025-8-17 13:35
就是有遗漏,不能包含所有的组合,你写个代码试试

来来来,换了个思路,部分代码来了, $b[$i1]是和,$a[$i1]~$a[$i2]是组合,怎么判断和提取不知道咋写,毕竟水平太菜...
Dim $a[5]=[0,1,3,4,5]
Dim $b[5]
;MsgBox(0,0,$a[5])
For $i1=0 To 4
        For $i2= $i1 To 4
                $b[$i1]=$b[$i1]+$a[$i2]
MsgBox(0,$i1 & '-' & $i2,$b[$i1])
        Next
        ;MsgBox(0,0,$b[$i1])
        Next  

评分

参与人数 1金钱 +40 收起 理由
vigiles + 40 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2026-4-15 20:53 , Processed in 0.081848 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表