C语言算法优化-百钱买百鸡


前言(注意本篇文章使用的都是C语言,适合小白)

在使用算法解决实际问题时,我们常常采用最直观的解法来完成目的。看似简单易懂的代码往往有许多问题,比如:超时,超内存,甚至出现BUG。所以我们需要尽可能仔细分析问题,找寻其中规律来简化算法。以此节约更多时间和内存。
提示:以下是本篇文章正文内容,下面案例可供参考

一、例题展示

以实际问题来举例(建议仔细阅读题目清楚涉及的变量防止下文懵逼)

*Description“百钱买百鸡”是我国著名的古代数学问题,中国古代数学家张丘建在他的《算经》中提出了这样一个问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
你的任务是求解下面这个问题。问题是这样描述的:a文钱可买一只公鸡,b文钱可买一只母鸡,c文钱可买d只小鸡。用m文钱买n只鸡,那么有公鸡x只、母鸡y只、小鸡z只。求解出符合题意的x,y,z。Input输入为一张表。第一行是一个固定不变的表头,格式见sample。后面有多行,每行为一组测试数据。每组测试数据由6个整数组成,分别为“a,b,c/d,m,n”。满足0<a,b,c,d<=50,50<=m,n<=108+1,并且母鸡和小鸡的单价不会相同。Output每组测试数据的运行结果输出为一张表,表头固定为“COCKS,HENS,CHICKS”。每组测试数据的一个可行解数出为一行,为三个整数:“x,y,z”。多组解按照公鸡数从少到多的顺序输出。若测试数据无解则输出“Cannot buy!”。两组测试数据之间用一个空行分隔开。
Sample Input
COCK,HEN,CHICK,MONEY,CHICKS
3,2,1/3,100,100
5,3,1/3,100,100
8,5,1/7,100,100
8,5,1/7,300,300
Sample Output
COCKS,HENS,CHICKS
0,40,60
5,32,63
10,24,66
15,16,69
20,8,72
25,0,75

COCKS,HENS,CHICKS
0,25,75
4,18,78
8,11,81
12,4,84

Cannot buy!

COCKS,HENS,CHICKS
8,40,252
HINT本题重点在于了解多重循环的运行效率问题
抛去题目要求的繁杂的步骤我们重点看该题的核心算法—x,y,z的找法
我们很容易就可以想到使用三重循环依次遍历所有的x,y,z。
在这里插入图片描述

很开心对吧如此简单的一道题,接下来只用按照题意去刻划细节就好了,但是细心的朋友会知道系统肯定会告诉你这道题Time Limit Exceed了。本来一层循环次数就多,再套上两层使得时间已经远远超出了限制。

二、优化初步

那么我们把重心放在调皮的时间上。算法的优化分两种,我们先从基本的开始。

1.减少循环次数

在循环中并不是每一个值都一定要轮到,也没有轮到的必要。这时候我们可以通过数学分析来去掉不必要的循环(这就要看读者的数学功底了)来减少部分浪费的时间。
例如:找素数的时候我们完全可以把范围设定在2-sqrt(目标数)之间。
本题x,y,z的取值1-m也完全浪费了很多不必要的时间。x最多取到m/a即可。

代码如下(示例):
在这里插入图片描述

2.减少循环嵌套

在循环次数已经无法再减少或者实在想不出来了,可以针对循环嵌套是否可以减少。
例如:求前n项和可以使用数列的求和公式,直接省去了循环。(但是要小心可能会超限)
这题我们完全可以用已经求出来的x,y来直接求出z。
代码如下(示例):
在这里插入图片描述

聪明的读者已经发现了,根据这个思路我们可以列出方程求解
这里要注意z的价格是分数,不要算错了
x+y+z=n
ax+by+c*z/d=m
相信解出这个方程对于大家都不困难,这样我们就只用一个循环即可
一下便是完整代码。
在这里插入图片描述

总结

以上便是文章全部内容。本文章重点在于对百鸡买百钱的题目解释和算法优化的启示。希望小白读者按照思路去优化自己的算法,大神请绕道(发抖)

  • 29
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值