不用循环的鸡兔同笼

这是我第一篇文章,大家多多关照!

这里先说一下,我喜欢用格式化输入输出,想用cout和cin的改过来就可以了。

今天给大家讲一下一题“坑死我”的题。

鸡兔同笼

总时间限制:1000ms 内存限制:65536KB

题目描述

一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多少只动物,至多有多少只动物。

输入格式

一行,一个正整数a (a < 32768)。

输入样例

20

输出格式

一行,包含两个正整数,第一个是最少的动物数,第二个是最多的动物数,两个正整数用一个空格分开。

如果没有满足要求的答案,则输出两个0,中间用一个空格分开。

输出样例

5 10

开始一看就想用循环,于是写出:

#include<cstdio>
int main(){
  int n,max=-1000,min=1000,t,flag=0;
  scanf("%d",&n);
  for(int i=0;i<n;i++){//i是兔子,j是鸡
    for(int j=n;j>=0;j--){
      if(i*4+j*2==n){
        if(min>i+j){
          flag=1;
          min=i+j;
        }
        if(max<i+j){
          flag=1;
          max=i+j;
        }
      }
    }
  }
  if(flag==0)
    printf("0 0");
  else
    printf("%d %d",min,max);
  return 0;
}

 然后就……

 我也不知道为啥,测试点就是不对。

最后终于找到了正确代码,自己写了下注释,希望大家能理解。

AC代码:

#include<cstdio>
int main(){
  int n;
  scanf("%d",&n); //要想总数最少,兔子要最多;要想总数最多,鸡要最多。
  if(n%2!=0)
    printf("0 0");//鸡和兔子的腿数都是双数,和不可能是奇数。确保n肯定能被2整除,以执行下一步。
  else if(n%4!=0)
    printf("%d %d\n",n/4+1,n/2); /*兔子最多,就用它除以四,达到最多数量,此时绝对还剩2条腿,
因为n不是奇数,又不能被四整除;此时n已经是2的倍数,因此取鸡的最多数就是把总数除以二。*/
  else
    printf("%d %d\n",n/4,n/2);//n如果是四的倍数,直接除以四;与上面同理。
  return 0;
}

我是不是讲得有点太复杂了?那我再用自己的样例解释一下吧。

样例1:

输入

21

输出

0 0

解释

21不能被2整除,因此无解。

样例2:

输入

22

输出

6 11

解释

22不能被四整除,因此用它除以四得到五,也就是兔的只数,还剩两只腿,就再加一只鸡,得到六;要想只数最多,就要让鸡最多,因为n已经是二的倍数,所以直接除以二,也就是全是鸡,得到十一。

样例3(也是题目给的样例):

输入

20

输出

5 10

解释

二十能被4整除,因此直接求全是兔的只数,也就是除以四,得到5只;鸡也是直接求全是鸡的只数,也就是除以2,得到十。

 大家懂了吗?记得点赞哦!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值