SDUST 软件工程2016-作业4-A 百钱买鸡问题
解决百钱买鸡问题原本并不困难,关键的是这道题对其进行了升级,测试数据太大,传统的解法,像三重循环,二重循环都会导致超时。
这道题正确的解法应该是结合数学方程进行化简,将其转化为1层循环:
x+y+z=n
ax+by+c/d*z=m
由上述两个方程联立可用其他量表示出y来。从而只需要枚举x就能解决该题。
在求方程之后注意要化简,只有能整除的时候才进行整除。最后与m比较的时候因为c/d的问题,所以等式两边同时乘以d以消除误差。
最后千万不要加上z%d==0的条件,因为例如当3元买12小鸡的时候,实际情况是最少买四只小鸡是合法情况不会出现小数,但z%12会变成最少买12只小鸡才是合法情况,所以应该去掉这个条件。
1 #include <stdio.h> 2 int main(){ 3 char s[100]; 4 long long a,b, c, d, m, n; 5 gets(s); 6 int first=0; 7 int ok; 8 int k=0; 9 while(scanf("%lld,%lld,%lld/%lld,%lld,%lld",&a,&b,&c,&d,&m,&n)!=EOF){ 10 k++; 11 if(first==0)first=1;else printf("\n"); 12 ok=0; 13 for(long long i=0;i<=m/a;i++){ 14 long long j; 15 if((m*d-c*n-(a*d-c)*i)%(b*d-c)==0) 16 j=(m*d-c*n-(a*d-c)*i)/(b*d-c); 17 if(j<0)continue; 18 long long z=n-i-j; 19 if((z*c+i*a*d+j*b*d)==m*d&&z>=0){ 20 if(!ok)printf("COCKS,HENS,CHICKS\n"); 21 ok=1; 22 printf("%lld,%lld,%lld\n",i,j,z); 23 } 24 } 25 if(!ok)printf("Cannot buy!\n"); 26 27 } 28 return 0; 29 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架