枚举法(1)

第1题     百钱百鸡     时限:1s 空间:256m
相传在南北朝时期(公元 386 年——公元 589 年),我国北方出了一个“神童”,他反映敏捷,计算能力超群,许多连大人一时也难以解答的问题,他一下子就给算出来了。远远近近的人都喜欢找他计算数学问题。“神童”的名气越来越大,传到当时宰相的耳中。有一天,宰相为了弄清“神童”是真是假,特地把“神童”的父亲叫了去,给了他 100 文钱,让第二天带 100 只鸡来。并规定 100 只鸡中公鸡、母鸡和小鸡都要有,而且不准多,也不准少,一定要刚好百钱百鸡。
 当时,买 1 只公鸡 5 文钱,买 1 只母鸡 3 文钱,买 3 只小鸡才 1 文钱。怎样才能凑成百钱百鸡呢?

聪明的你,能帮神童算一算吗?

输入格式

输出格式
每种买法占一行,由3个数组成,顺序为 公鸡数 母鸡数 小鸡数。每个数字空格隔开。

输出时,按公鸡数从少到多,母鸡数从多到少的顺序输出,本题符合条件的第一组解为:4 18 78。

#include<bits/stdc++.h>
using namespace std;
int main(){   
    for(int i=1;i<=20;i++)
    {
        for(int j=30;j>=1;j--)
        {
            if(7*i+4*j==100&&(100-i-j)%3==0)
            {
                cout<<i<<" "<<j<<" "<<100-i-j<<" "<<endl;
            }
        }
    }
    return 0;
}
第2题     鸡兔同笼     时限:1s 空间:256m
鸡兔同笼问题:一个笼子里面有鸡若干只,兔若干只。共有头50个,共有腿160条。求鸡兔各多少只?

输入格式

输出格式
两个整数,在一行。
鸡的只数 兔的只数 中间空格隔开!

#include<bits/stdc++.h>
using namespace std;
int main(){
    int x=0,y=0;
    for(int i=1;i<=50;i++)
    {
        for(int j=1;j<=50;j++)
        {
            if(i*2+j*4==160&&i+j==50)
            {
                x=i;
                y=j;
                break;
            }
        }
    }
    cout<<x<<" "<<y;
    return 0;
}
第3题     公园门票     时限:1s 空间:256m
某公园门票价格为:成人票8元/张,儿童票3元/张;某旅游团来公园游玩,该团内有成人和儿童(成人和儿童都有),共花了40元买门票,请你分别计算出成人和儿童可能的人数,按照成人从少到多,儿童从多到少的规律数出结果。

输入格式

输出格式
若干行,每行2个整数用空格隔开,分别代表成人和儿童可能的人数(成人从少到多,儿童从多到少)

#include<bits/stdc++.h>
using namespace std;
int main(){
    for(int i=5;i>=1;i--)
    {
        for(int j=1;j<=13;j++)
        {
            if(i*8+j*3==40)
            {
                cout<<i<<" "<<j;
            }
        }
    }
    return 0;
}
第4题     小猫跟小狗     时限:1s 空间:256m
某动物饲养中心用X元专款购买小狗(每只A元)和小猫(每只B元)两种小动物。
要求专款专用,(至少猫狗各一),正好用完?请求出方案的总数。如没有请输出0.

输入格式
输入一行,只有三个整数.分别为X,A,B. ( 100 < X < 32768; 1 <= A, B <= 100 )

输出格式
输入一行,只有三个整数.分别为X,A,B. ( 100 < X < 32768; 1 <= A, B <= 100 )
输入/输出例子1
输入:

1700 31 21

输出:

3

#include <bits/stdc++.h>
using namespace std;
int main() {
     int x,a,b;
    cin>>x>>a>>b;
    int sum=0;
    for(int i=1;i<x/a;i++)
    {
        for(int j=1;j<x/b;j++)
        {
            if(i*a+j*b==x)
            {
                sum++;
            }
        }
    }
    cout<<sum;
    return 0;
}
第5题     阿凡提买餐具     时限:1s 空间:256m
阿凡提,,是一位活跃在西起摩洛哥、东到中国新疆伊斯兰诸民族中的人物,他普渡穷苦人民、阻止权贵剥削穷苦人民、阻止蒙古继续西进,通天彻地,兼顾数家学问,人不能及。有一次,阿凡提去集市上买餐具,财主正好在卖餐具,所以准备为难一下阿凡提;财主的餐具有2种:大碗和小碗,财主和阿凡提说,你买我的碗,要花光你带的钱,而且,两种碗都要买,买的两种碗的数量都得是偶数,请你编程帮助阿凡提计算,可以有哪些购买的方案呢?

输入格式
三个整数,分别代表了阿凡提带的钱的数量,大碗的价格,小碗的价格!

输出格式
所有的购买方案,一行一个方案,先输出大碗的采购只数,再输出小碗的采购只数!

输入/输出例子1
输入:

100 20 10

输出:

2 6
4 2

#include <bits/stdc++.h>
using namespace std;
int main() {
    int x,a,b;
    cin>>x>>a>>b;
    for(int i=1;i<=x/a;i++)
    {
        for(int j=1;j<=x/b;j++)
        {
            if(i*a+j*b==x&&i%2==0&&j%2==0)
            {
                cout<<i<<" "<<j<<endl;
            }
        }
    }
    return 0;
}
第6题     建篱笆     时限:1s 空间:256m
超级可爱善良的李梅回到乡下时想给她的玩具建造一个四边形的围栏,她有一块长度为整数N(4≤N≤100)的木板。她希望在三个点上切开这块木板,把它变成长度均为整数的四块小木板。

这四块木板的长度可以是任意的正整数,只要李梅能够用它们组成一个四边形,那么,她有多少种不同的切割木板的方法?

注意:

 *只要有一个切割点不同,那么两种切割方式就不同。不用考虑对称之类的复杂情况。

*可以确定的是,木板的长度肯定大于0。
输入格式
一个正整数N

输出格式
一个正整数,表示有多少种可行的切割方式

输入/输出例子1
输入:

6

输出:

6

样例解释
李梅有10种切割方式: (1, 1, 1,3); (1, 1, 2, 2); (1, 1, 3, 1); (1, 2, 1, 2); (1, 2, 2, 1); (1, 3,1, 1); (2, 1, 1, 2); (2, 1, 2, 1); (2, 2, 1, 1); or (3, 1, 1, 1)。
其中 (1, 1, 1, 3), (1, 1, 3, 1), (1, 3, 1, 1)和 (3,1, 1, 1) 四种方式不能构成四边形。

(本来我想把n的范围设为4~10000的,想一想,简单点就4~100吧///大神们想想如果范围是4~10000怎么办~~)

#include<bits/stdc++.h>
using namespace std;
int main(){    
    int n,s;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n-i;j++)
        {
            for(int k=1;k<=n-i-j;k++)
            {
                for(int d=1;d<=n-i-j-k;d++)
                {
                    if(i+j+k+d==n&&i<j+k+d&&j<i+k+d&&k<i+j+d&&d<i+j+k)
                        s++;
                }
            }
        }
    }
    cout<<s;
    return 0;
}
第7题     灯的开关状态     时限:5s 空间:256m
有N 个灯放在一排,从1 到N 依次顺序编号。有N 个人也从1 到N 依次编号。1 号将灯全部关闭,2号将凡是2 的倍数的灯打开;3 号将凡是3 的倍数的灯作相反处理(该灯如为打开的,则将它关闭;如关闭的,则将它打开)。以后的人都和3 号一样,将凡是自己编号倍数的灯作相反处理。   

编程实现:第N 个人操作后,按顺序输出灯的状态。(1-表示灯打开,0-表示灯关闭)

输入格式
输入:N(1≤N≤5000000) ,灯的个数

输出格式
输出:灯的状态,01 序列,中间无空格

输入/输出例子1
输入:

2

输出:

01

样例解释
(本题时间限制为5秒)

#include<bits/stdc++.h>
using namespace std;
int n,a[5000000];
int main(){ 
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        if(i%2==0) a[i]=1;
    }
    for(int i=3;i<=n;i++)
    {
        for(int j=0;j<=n;j=j+i)
        {
            if(a[j]==0) a[j]=1;
            else if(a[j]==1) a[j]=0;
        } 
    }
    for(int i=1;i<=n;i++)
        cout<<a[i];
    return 0;
}

谢谢大家的观看!

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值