SDUST 軟體工程2016-作業4-A 百錢買雞問題

deepwzh發表於2016-11-05

解決百錢買雞問題原本並不困難,關鍵的是這道題對其進行了升級,測試資料太大,傳統的解法,像三重迴圈,二重迴圈都會導致超時。

這道題正確的解法應該是結合數學方程進行化簡,將其轉化為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 }

 

相關文章