【蓝桥杯练习-2016年-第七届】省赛-C语言大学A组

1.网友年龄

某君新认识一网友。
当问及年龄时,他的网友说:
“我的年龄是个2位数,我比儿子大27岁,
如果把我的年龄的两位数字交换位置,刚好就是我儿子的年龄”

请你计算:网友的年龄一共有多少种可能情况?

提示:30岁就是其中一种可能哦.

请填写表示可能情况的种数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

  • (7)

#include <stdio.h>
main()
{
	int i,ans=0;
	for(i=10;i<100;i++)
		if((i-27)==((i%10)*10+i/10))
		{
			ans++;
			printf("%d\n",i);
		}
	printf("%d",ans);
	return 0;
}

2.生日蜡烛

某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。

现在算起来,他一共吹熄了236根蜡烛。

请问,他从多少岁开始过生日party的?

请填写他开始过生日party的年龄数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

  • (26)

#include <stdio.h>
main()
{
	int i,j;
	for(i=0;i<100;i++)
		for(j=i;j<100;j++)
		{
			if((i+j)*(j-i+1)/2==236)
				printf("%d\n",i);
		}
	return 0;
}

3.方格填数

如下的10个格子

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)      

一共有多少种可能的填数方案?

  • (1580)

//暴力求解法,直接用全排列把所有可能理出来判断 
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
	int ans=0;
	int a[10]={0,1,2,3,4,5,6,7,8,9};
	do{
		if(a[1]!=a[0]+1&&a[1]!=a[0]-1&&a[3]!=a[0]+1&&a[3]!=a[0]-1&&a[4]!=a[0]+1&&a[4]!=a[0]-1&&a[5]!=a[0]+1&&a[5]!=a[0]-1&&
			a[2]!=a[1]+1&&a[2]!=a[1]-1&&a[4]!=a[1]+1&&a[4]!=a[1]-1&&a[5]!=a[1]+1&&a[5]!=a[1]-1&&a[6]!=a[1]+1&&a[6]!=a[1]-1&&
				a[5]!=a[2]+1&&a[5]!=a[2]-1&&a[6]!=a[2]+1&&a[6]!=a[2]-1&&
					a[4]!=a[3]+1&&a[4]!=a[3]-1&&a[7]!=a[3]+1&&a[7]!=a[3]-1&&a[8]!=a[3]+1&&a[8]!=a[3]-1&&
						a[5]!=a[4]+1&&a[5]!=a[4]-1&&a[7]!=a[4]+1&&a[7]!=a[4]-1&&a[8]!=a[4]+1&&a[8]!=a[4]-1&&a[9]!=a[4]+1&&a[9]!=a[4]-1&&
							a[6]!=a[5]+1&&a[6]!=a[5]-1&&a[8]!=a[5]+1&&a[8]!=a[5]-1&&a[9]!=a[5]+1&&a[9]!=a[5]-1&&
								a[9]!=a[6]+1&&a[9]!=a[6]-1&&
									a[8]!=a[7]+1&&a[8]!=a[7]-1&&
									a[9]!=a[8]+1&&a[9]!=a[8]-1 )
							ans++;
		else continue;
	}while(next_permutation(a,a+10));
	cout<<ans;
} 

4.寒假作业

现在小学的数学题目也不是那么好玩的。
看看这个寒假作业:

   □ + □ = □
   □ - □ = □
   □ × □ = □
   □ ÷ □ = □
   
   (如果显示不出来,可以参见【图1.jpg】)
   
每个方块代表1~13中的某一个数字,但不能重复。
比如:
 6  + 7 = 13
 9  - 8 = 1
 3  * 4 = 12
 10 / 2 = 5

以及: 
 7  + 6 = 13
 9  - 8 = 1
 3  * 4 = 12
 10 / 2 = 5

就算两种解法。(加法,乘法交换律后算不同的方案)
 
你一共找到了多少种方案?

//同3,暴力求解法,直接用全排列把所有可能理出来判断 
#include <iostream>
#include <algorithm>
using namespace std;

int main(){
	int ans=0;
	int a[13]={1,2,3,4,5,6,7,8,9,10,11,12,13};
	do{
		if((a[0]+a[1]==a[2])&&(a[3]-a[4]==a[5])&&(a[6]*a[7]==a[8])&&(a[9]/a[10]==a[11])&&(a[9]%a[10]==0)  ){
			//注意第四个式子的判断条件 
			cout<<a[0]<<"+"<<a[1]<<"="<<a[2]<<endl;
			cout<<a[3]<<"-"<<a[4]<<"="<<a[5]<<endl;
			cout<<a[6]<<"*"<<a[7]<<"="<<a[8]<<endl;
			cout<<a[9]<<"/"<<a[10]<<"="<<a[11]<<endl;
			cout<<endl;     //输出验证一下 
			ans++;
		}
		
		else continue;
	}while(next_permutation(a,a+13));
	cout<<ans;
} 

8. 四平方和

四平方和定理,又称为拉格朗日定理:
每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。

比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2
(^符号表示乘方的意思)

对于一个给定的正整数,可能存在多种平方和的表示法。
要求你对4个数排序:
0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法


程序输入为一个正整数N (N<5000000)
要求输出4个非负整数,按从小到大排序,中间用空格分开

例如,输入:
5
则程序应该输出:
0 0 1 2

再例如,输入:
12
则程序应该输出:
0 2 2 2

再例如,输入:
773535
则程序应该输出:
1 1 267 838

资源约定:
峰值内存消耗 < 256M
CPU消耗  < 3000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

//减少循环数以减少耗时
#include <iostream>
#include <math.h>
#include <stdio.h>
using namespace std;
int main(){
	int N;
	int a[4]={0,0,0,0};
	scanf("%d",&N);
	for(int i=0;i*i<N;i++){
		for(int j=i;j*j<N;j++){
			for(int k=j;k*k<N;k++){
				int num = i*i+j*j+k*k;
				double M = N - num;
				if((sqrt(M)-int(sqrt(M))== 0)&&(sqrt(M)>k)){
					cout<<i<<"  "<<j<<"  "<<k<<"  "<<sqrt(M);
					return 0;
			
				}		
			}
		}
	}
	return 0;
} 

9.密码脱落

X星球的考古学家发现了一批古代留下来的密码。
这些密码是由A、B、C、D 四种植物的种子串成的序列。
仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。
由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。

你的任务是:
给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。

输入一行,表示现在看到的密码串(长度不大于1000)
要求输出一个正整数,表示至少脱落了多少个种子。

例如,输入:
ABCBA
则程序应该输出:
0

再例如,输入:
ABDCDCBABC
则程序应该输出:
3

资源约定:
峰值内存消耗 < 256M
CPU消耗  < 1000ms

//对于较大的字符串可能会超时 
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
char s[1000];

char *rev(char *s) {
    int len = strlen(s);//sizeof(s) / sizeof(char);
    char *ans = (char*)malloc(len* sizeof(char));//(char *) malloc(sizeof(s));
    for (int i = 0; i < len; ++i) {
        ans[i] = s[len - 1 - i];
    }
    return ans;
}

int lcs(const char *s1, const char *s2,int len) {
    int dp[len][len];
    for (int i = 0; i < len; ++i) {
        if(s1[i]==s2[0])dp[0][i]=1;
        else dp[0][i]=(i==0?0:dp[0][i-1]);
    }

    for (int j = 0; j < len; ++j) {
        if(s2[j]==s1[0])dp[j][0]=1;
        else dp[j][0]= (j==0 ? 0:dp[j-1][0]);
    }
    for (int i = 1; i < len; ++i) {
        for (int j = 1; j < len; ++j) {
            if(s2[i]==s1[j])dp[i][j]= dp[i-1][j-1]+1;
            else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
        }
    }
    return dp[len-1][len-1];
}

int main(int argc, const char *argv[]) {
//    cout<<lcs("ABDCDCBABC",rev("ABDCDCBABC"),10)<<endl;
freopen("/Users/zhengwei/CLionProjects/lanqiaobei2019/2016_C_A/data9/in2.txt","r",stdin);
    scanf("%s", &s);
    int len = strlen(s);
    int l = lcs(s, rev(s),len);
    printf("%d",len-l);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/A993852/article/details/82872763