枚举

zyl 喵星人 2023-08-24 9:58:19 2023-10-08 15:17:21 23

简简单单的枚举题

法一:究极暴力枚举

根据题意,我们可以获取总的头数为x,总的脚数为y

int x,y;
cin>>x>>y;

现在我们可以用总的头数去枚举每一种可能,那么鸡的只数就在0~x之间,兔子的个数也是在0~x之间

所以我们可以得到以下的枚举代码

// 先枚举鸡的数量: 0~x 只
for(int i=0;i<=x;i++){
    // 再枚举兔的数量:0~x 只
    for(int j=0;j<=x;j++){
        // 验证方案是否合理
    }
}

我们要用两个条件去验证枚举的方案是否合理。如下:

鸡的数量 + 兔的数量 = 总头数(一个动物一个头)

鸡的脚数 + 兔的脚数 = 总脚数

if(i+j==x && i*2+j*4==y){
    cout<<i<<endl<<j;
    return 0;  // 题目只有两个输出,可以保证唯一解,找到一组就结束程序
}

完整代码:

#include<iostream>
using namespace std;

int main(){
	int x,y;
	cin>>x>>y;
	for(int i=0;i<=x;i++){
		for(int j=0;j<=x;j++){
			if(i+j==x && i*2+j*4==y){
				cout<<i<<endl<<j;
				return 0;  // 题目只有两个输出,可以保证唯一解,找到一组就结束程序
			}
		}
	}
	return 0;
}

法二:优化枚举

根据题意可知,只有鸡和兔两种动物,总数为x。如果枚举了鸡的数量,那么兔子的数量直接可算,不用继续枚举

兔的数量 = 总头数 - 鸡的数量

所以,只需要枚举鸡的数量,一个for循环即可

// 枚举鸡的数量
for(int i=0;i<=x;i++){
    // 直接计算出兔的数量,不用枚举
    int j = x - i;
    // 验证枚举的方案是否满足要求,因为兔的数量直接算出来的,所以不用验证头数
    if(i*2+j*4==y){
        cout<<i<<endl<<j;
        return 0;  // 同上
    }
}

完整代码:

// 自己改
{{ vote && vote.total.up }}