SDUST 软件工程2016-作业4-A 百钱买鸡问题

Posted Wade_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于SDUST 软件工程2016-作业4-A 百钱买鸡问题的主要内容,如果未能解决你的问题,请参考以下文章

百钱买百鸡

Java实现百钱买百鸡

3. 百钱买白鸡问题

百钱买百鸡

C语言程序设计百钱买百鸡(百钱百鸡,百鸡问题)!

百钱买鸡鸣