这是我第一篇文章,大家多多关照!
这里先说一下,我喜欢用格式化输入输出,想用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,得到十。
大家懂了吗?记得点赞哦!