枚举算法基础(C++)

第1题     鸡兔同笼     时限:1s 空间:256m

一只鸡有2个脚,一只兔有4个脚。你需要购买若干只鸡和若干只兔,使得下面两个条件同时成立:

1、鸡的数量加上兔的数量等于a

2、鸡和兔总共有b只脚。

如果可以完成任务输出”Yes”,否则输出”No”

输入格式

一行,两个整数,ab1<=a<=100, 1<=b<=100

输出格式

“Yes”或者”No”双引号不用输出。

输入/输出例子1

输入:

3 8

输出:

Yes

输入/输出例子2

输入:

2 100

输出:

No

#include<bits/stdc++.h>
using namespace std;
int a,b,s;
int main(){
    cin>>a>>b;
    for(int i=0;i<=a;i++){
        for(int j=0;j<=a;j++){
        	if(i+j==a&&i*2+j*4==b){
        		s=1;
        	}
        }
    }
    if(s==1)cout<<"Yes";
    else cout<<"No";
    return 0;
}

第2题     阿凡提买餐具     时限:1s 空间:256m

阿凡提,,是一位活跃在西起摩洛哥、东到中国新疆伊斯兰诸民族中的人物,他普渡穷苦人民、阻止权贵剥削穷苦人民、阻止蒙古继续西进,通天彻地,兼顾数家学问,人不能及。有一次,阿凡提去集市上买餐具,财主正好在卖餐具,所以准备为难一下阿凡提;财主的餐具有2种:大碗和小碗,财主和阿凡提说,你买我的碗,要花光你带的钱,而且,两种碗都要买,买的两种碗的数量都得是偶数,请你编程帮助阿凡提计算,可以有哪些购买的方案呢?

输入格式

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

输出格式

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

输入/输出例子1

输入:

100 20 10

输出:

2 6
4 2

#include<bits/stdc++.h>
using namespace std;
long long x,a,b;
int main(){
    scanf("%lld%lld%lld",&x,&a,&b);
    for(long long i=1;i<=x/a;i++){
        for(long long j=1;j<=x/b;j++){
            if(i*a+j*b==x&&i%2==0&&j%2==0){
                printf("%lld %lld\n",i,j);
            }
        }
    }
    return 0;
}

第3题     三角形个数     时限:1s 空间:256m

输入一根木棒的长度 n,1≤n≤10000,将该木棒分成三段,每段的长度为正整数,输出由该三段小木棒组成的不一样的三角形个数。

输入/输出例子1

输入:

10

输出:

2

样例解释

两个能组成的三角形边长分别为 2、4、4 和 3、3、4。
 

#include<bits/stdc++.h>
using namespace std;
int n,s,k;
int main(){
    cin>>n;
    for(int i=1;i<=n-2;i++){
    	for(int j=i;j<=n-i-1;j++){
    		k=n-i-j;
    		if(i+j>k&&i+k>j&&k+j>i&&k>=j)s++;
    	}
    }
    cout<<s;
    return 0;
}

第4题     建篱笆     时限:1s 空间:256m

超级可爱善良的吴梦琪回到乡下时想给她的玩具建造一个四边形的围栏,她有一块长度为整数N(4N100)的木板。她希望在三个点上切开这块木板,把它变成长度均为整数的四块小木板。

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

注意:

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

*可以确定的是,木板的长度肯定大于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 n,s;
int main(){
    cin>>n;
    for(int a=1;a<n;a++){
        for(int b=1;b<n-a;b++){
            for(int c=1;c<n-a-b;c++){
                int d=n-a-b-c;
                if(a+b+c>d&&a+b+d>c&&a+c+d>b&&b+c+d>a){
                    s++;
                }
            }
        }
    }
    cout<<s;
    return 0;
}

第5题     阿姆斯特朗数     时限:1s 空间:256m

编程找出所有的三位数到六位数中的阿姆斯特朗数。阿姆斯特朗数也叫水仙花数,它的定义如下:若一个n位自然数的各位数字的n次方之和等于它本身,则称这个自然数为阿姆斯特朗数。例如,153(153=1X1X1+3X3X3+5X5X5)是一个三位的阿姆斯特朗数,8208则是一个四位的阿姆斯特朗数。

输出格式

每行输出一个阿姆斯特朗数,按从小到大的顺序按行输出。

#include<bits/stdc++.h>
using namespace std;
int a[15][15],f[15],t,s;
int main(){
	for(int i=1;i<=9;i++){
		a[i][1]=i;
		for(int j=2;j<=7;j++){
			a[i][j]=a[i][j-1]*i;
		}
	}
	for(int i=100;i<=999999;i++){
		t=i,s=0;
		while(t){
			s++;
			f[s]=t%10;
			t=t/10;
		}
		int s1=0;
		for(int j=1;j<=s;j++){
			s1=s1+a[f[j]][s];
		}
		if(s1==i){
			printf("%d\n",s1);
		}
	}
	return 0;
} 

第6题     楼层     时限:5s 空间:256m

小明要去X国旅游,他决定预定X国的酒店房间。已知小明预定房间的酒店有一个奇怪的规矩,它每天都有一个低能数字t,这个数字该天是不能出现在楼层号里的。例如某一天的t=3,则该天的楼层号不会出现313233031……等,即只有编号为1245……等楼层号。所以4楼实际上是第3层。 
已知小明订了m层的房间,而他入住当天的低能数字为t,现在小明想知道他的房间实际是在第几层。

输入格式

两个数,mt1≤m≤1000000≤t≤9)。

输出格式

一个数,表示真实的楼层。

输入/输出例子1

输入:

14 3

输出:

12

#include<bits/stdc++.h>
using namespace std;
long long n,l,k,a[10005],s,p,m;
int main(){
    scanf("%lld%lld",&n,&l);
    for(int i=1;i<=n;i++){
        p=0,k=0,s=i;
        while(s!=0){
            k++;
            a[k]=s%10;
            s=s/10;    
        }
        for(int i=1;i<=k;i++){
            if(a[i]==l)p=1; 
        }
        if(p==0)m++;
    }
    printf("%lld",m);
    return 0;
}

第7题     编号     时限:1s 空间:256m

农场主 John 想给他的 N (1 <= N <= 1,000,000) 头奶牛编号,但是奶牛们都不喜欢数字 L (0 <= L <= 9) ,所以 John 不能用数字L 
已知编号都是正整数,请问这N头牛中的最大编号至少是多少?

输入格式

一行: 两个用空格分开的整数: N 和 L

输出格式

一行一个整数。即 John 所写的最大数

输入/输出例子1

输入:

10 1

输出:

22

样例解释

John能使用的最小的10位数字为: 2, 3, 4, 5, 6, 7, 8, 9, 20, 22.

#include<bits/stdc++.h>
using namespace std;
long long n,l,k,a[1005],s,p,m;
int main(){
    scanf("%lld%lld",&n,&l);
    for(int i=1;;i++){
        p=0,k=0,s=i;
        while(s!=0){
            k++;
            a[k]=s%10;
            s=s/10;    
        }
        for(int i=1;i<=k;i++){
            if(a[i]==l){
            	p=1;
            }
        }
        if(p==0)m++;
        if(m==n){
            cout<<i;
            return 0;
        }
    }
    return 0;
}

第8题     烤鸡     时限:1s 空间:256m

猪猪 Hanke 得到了一只鸡。猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 10种配料(芥末、孜然等),每种配料可以放 到 3克,任意烤鸡的美味程度为所有配料质量之和。

现在, Hanke 想要知道,如果给你一个美味程度 ,请输出这 10种配料的所有搭配方案。

输入格式

一个正整数 n,表示美味程度。

输出格式

第一行,方案总数。

第二行至结束,10个数,表示每种配料所放的质量,按字典序排列。

如果没有符合要求的方法,就只要在第一行输出一个 0

输入/输出例子1

输入:

11

输出:

10

1 1 1 1 1 1 1 1 1 2

1 1 1 1 1 1 1 1 2 1

1 1 1 1 1 1 1 2 1 1

1 1 1 1 1 1 2 1 1 1

1 1 1 1 1 2 1 1 1 1

1 1 1 1 2 1 1 1 1 1

1 1 1 2 1 1 1 1 1 1

1 1 2 1 1 1 1 1 1 1

1 2 1 1 1 1 1 1 1 1

2 1 1 1 1 1 1 1 1 1 

样例解释

100%的数据,n≤50

#include<bits/stdc++.h>
using namespace std;
template<typename T>
string to_string(T value){
	ostringstream os;
	os<<value;
	return os.str();
}
long long n,s=0;
int main(){
    scanf("%lld",&n);
    if(n<10||n>30){
        printf("0");
        return 0;
    }
    string str;
    for(int a=1;a<=3;a++){
	    for(int b=1;b<=3;b++){
		    for(int c=1;c<=3;c++){
			    for(int d=1;d<=3;d++){
				    for(int e=1;e<=3;e++){
					    for(int f=1;f<=3;f++){
						    for(int g=1;g<=3;g++){
							    for(int h=1;h<=3;h++){
								    for(int i=1;i<=3;i++){
								    	for(int j=1;j<=3;j++){
									        if(a+b+c+d+e+f+g+h+i+j==n){
									            str+=to_string(a)+" "+to_string(b)+" "+to_string(c)+" "+to_string(d)+" "+to_string(e)+" "+to_string(f)+" "+to_string(g)+" "+to_string(h)+" "+to_string(i)+" "+to_string(j)+"\n";
									            s++;
									        }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    printf("%lld\n",s);
    cout<<str;
    return 0;
}

第9题     最长回文数     时限:5s 空间:256m

输入一个长度不超过16位的正整数,求其中最长的是回文数的一段的长度。例如:3476588592,其中最长的回文数是 5885,长度为4

输入格式

第一行有1个正整数N1<=N<=10^16)。


 

输出格式

输出最长回文数长度。

输入/输出例子1

输入:

234312

输出:

3

#include<bits/stdc++.h>
using namespace std;
int f(string str){
    int i=0,k=str.size()-1;
    for(;i<k;i++,k--)
        if(str[i]!=str[k])
            return 0;
    return 1;
}
string s;
int m=1;
int main(){
    cin>>s;
    for(int i=0;i<s.size();i++){
        for(int k=1;k<=s.size();k++){
            if(f(s.substr(i,k-i))){
                m=max(m,k-i);
            }
        }
    }
    printf("%d",m);
    return 0;
}

第10题     硬币兑换     时限:1s 空间:256m

在一个货币种类十分发达的国家,硬币的使用也十分频繁,某经济学家为人们设计了四种硬币:1元,2元,5元和10元。有一天一位负责某中央银行硬币兑换业务的专员产生了这样一个疑问:如果客户给定了要兑换的金额,我可以有多少种硬币组合的兑换方式呢?例如:兑换金额为6元,可产生5种组合方式:3个2元、2个2元和2 个1元,1个2元和4 个1元, 1个5元和1个1 元,6个1元。我们的任务是帮助他们找出某个金额所产生的所有组合数目。

输入格式

需兑换的金额数n(n<500)

输出格式

可选择的兑换方式的种数

输入/输出例子1

输入:

6

输出:

5

#include<bits/stdc++.h>
using namespace std;
int f(int s1){
    int dp[100005];
    dp[0]=1;
	int x[]={1,2,5,10},s=sizeof(x)/sizeof(x[0]);
    for(int i=0;i<s;i++){
        for(int j=x[i];j<=s1;j++){
            dp[j]+=dp[j-x[i]];
        }
	}
    return dp[s1];
}
int main(){
    int n;
    cin>>n;
    cout<<f(n);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值