蓝桥杯——计算机研究生机试真题(2017.2.14)

1. (2008年北京大学图形实验室计算机研究生机试真题)吃糖果
题目描述:
名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0)。
妈妈告诉名名每天可以吃一块或者两块巧克力。
假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案。
例如:
如果N=1,则名名第1天就吃掉它,共有1种方案;
如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案;
如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案;
如果N=4,则名名可以第1天吃1块,剩3块,也可以第1天吃2块,剩2块,共有3+2=5种方案。
现在给定N,请你写程序求出名名吃巧克力的方案数目。
输入:
输入只有1行,即整数N。
输出:
可能有多组测试数据,对于每组数据,
输出只有1行,即名名吃巧克力的方案数。
样例输入:
4
样例输出:

5

源代码:

#include <stdio.h>
int main()
{
	int i;
	int N,count[20];                 //count数组记录吃糖方案数
	count[0]=1,count[1]=2;
	for(i=2;i<20;i++)
		count[i]=count[i-1]+count[i-2];
	while(scanf("%d",&N)!=EOF)
		printf("%d\n",count[N-1]);
	return 0;
}
程序截图:


2. (2002年华中科技大学计算机研究生机试真题)守形数
题目描述:
守形数是这样一种整数,它的平方的低位部分等于它本身。
比如25的平方是625,低位部分是25,因此25是一个守形数。
编一个程序,判断N是否为守形数。
输入:
输入包括1个整数N,2<=N<100。
输出:
可能有多组测试数据,对于每组数据,
输出"Yes!”表示N是守形数。
输出"No!”表示N不是守形数。
样例输入:
25
4
样例输出:
Yes!
No!

源代码:

#include <stdio.h>
int main()
{
	int i,N;
	int t,sum,wei;                 //sum-累加和  wei-数位对应权值 
	int flag;                      //判断是否是守形数 
	while(scanf("%d",&N)!=EOF)
	{
		sum=0;
		wei=1;
		t=N*N;
		flag=0;
		while(t)
		{
			sum+=((t%10)*wei);     //从低位到高位累加求和 (如625:5->25->625) 
			wei*=10;
			t/=10;
			if(sum==N)
			{
				printf("Yes!\n");
				flag=1;
				break;
			}
		}
		if(flag==0)
			printf("No!\n");
	}
	return 0;
}
程序截图:


3. (2008年北京大学软件所计算机研究生机试真题)字符串排序
题目描述:
先输入你要输入的字符串的个数。然后换行输入该组字符串。每个字符串以回车结束,每个字符串少于一百个字符。
如果在输入过程中输入的一个字符串为“stop”,也结束输入。
然后将这输入的该组字符串按每个字符串的长度,由小到大排序,按排序结果输出字符串。
输入:
字符串的个数,以及该组字符串。每个字符串以‘\n’结束。如果输入字符串为“stop”,也结束输入.
输出:
可能有多组测试数据,对于每组数据,
将输入的所有字符串按长度由小到大排序输出(如果有“stop”,不输出“stop”)。
样例输入:
5
sky is grey
cold
very cold
stop
3
it is good enough to be proud of
good
it is quite good
样例输出:
cold
very cold
sky is grey
good
it is quite good
it is good enough to be proud of

【分析】注意对输入字符串的保存;输入中的回车可能会对结果产生干扰,故每次输入n结束后输入字符串前使用getchar(); “清空缓冲区”

源代码:

法一:二维字符数组

#include <stdio.h>
#include <string.h>
#define maxn 1000
#define maxlen 101
void Sort(char str[][maxlen],int n)      //按串长对字符串排序 
{
	char t[maxlen];
	int i,j;
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-1-i;j++)
		{
			if(strlen(str[j]) > strlen(str[j+1]))
			{
				strcpy(t,str[j]);
				strcpy(str[j],str[j+1]);
				strcpy(str[j+1],t);
			}
		}
	}
}
int main()
{
	int i,n,num;
	char str[maxn][maxlen];              //二维字符数组保存输入的字符串 
	char temp[maxlen];                   //记录输入的字符串 
	while(scanf("%d",&n)!=EOF)
	{
		getchar();                       //getchar()接收回车符,避免对后续输入输出产生干扰 
		for(i=0;i<n;i++)
		{
			gets(temp);
			if(strcmp(temp,"stop")==0)
				break;
			strcpy(str[i],temp);
		}
		num=i;
		Sort(str,num);
		for(i=0;i<num;i++)
			printf("%s\n",str[i]);
	}
	return 0;
}

法二:法一基础上结合STL完成排序功能,降低算法复杂度

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 
#define maxn 1000
#define maxlen 101
int cmp(const void *a,const void *b)
{
	return strlen((char *)a)-strlen((char *)b);
}
int main()
{
	int i,n,num;
	char str[maxn][maxlen];              //二维字符数组 保存输入的字符串 
	char temp[maxlen];                   //记录输入的字符串 
	while(scanf("%d",&n)!=EOF)
	{
		getchar();                       //getchar()接收回车符,避免对后续输入输出产生干扰 
		for(i=0;i<n;i++)
		{
			gets(temp);
			if(strcmp(temp,"stop")==0)
				break;
			strcpy(str[i],temp);
		}
		num=i;
		qsort(str,num,sizeof(str[0]),cmp);
		for(i=0;i<num;i++)
			printf("%s\n",str[i]);
	}
	return 0;
}

法三:C语言环境下,自定义结构体,构造“字符串类型”

源代码:

#include <stdio.h>
#include <string.h>
#define maxn 1000
#define maxlen 101
typedef struct                     //自定义字符串类型
{
	char str[maxlen];
	int len;
} String;
void Sort(String string[],int n)
{
	String t;
	int i,j;
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-1-i;j++)
		{
			if(string[j].len>string[j+1].len)
			{
				t=string[j];
				string[j]=string[j+1];
				string[j+1]=t;
			}
		}
	}
}
int main()
{
	int i,n,num;
	String string[maxn];
	while(scanf("%d",&n)!=EOF)
	{
		i=0;
		getchar();
		while(i<n)
		{
			gets(string[i].str);
			string[i].len=strlen(string[i].str);
			if(strcmp(string[i].str,"stop")==0)
				break;
			i++;
		}
		num=i;
		Sort(string,num);
		for(i=0;i<num;i++)
			printf("%s\n",string[i].str);
	}
	return 0;
}
程序截图:


※4. (2005年浙江大学计算机及软件工程研究生机试真题)最大连续子序列
题目描述:
    给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和为20。现在增加一个要求,即还需要输出该子序列的第一个和最后一个元素。
输入:
    测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( K< 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。
输出:
    对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
样例输入:
6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0
样例输出:
20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0

【分析】注意找连续的一组正数,且满足和最大

源代码:

#include <stdio.h>
#define maxn 10000
int main()
{
	int a[maxn],K;
	int i,j,tmp,maxsum;           //j-终点"伪指针" tmp-数组前i项和 maxsum-最大连续子序列和 
	int start,end;                //最大连续子序列起点与终点下标 
	while(scanf("%d",&K)!=EOF)
	{
		if(K==0)
			break;
		j=0,tmp=0,maxsum=-1;
		start=0,end=K-1;
        for(i=0;i<K;i++)
            scanf("%d",&a[i]);
        for(i=0;i<K;i++)
        {
            tmp+=a[i];
            if(tmp>maxsum)        //当前数组前i+1项和>最大连续子序列和 
            {  
				start=j;
				end=i;
  				maxsum=tmp;
            }
            else if(tmp<0)        //tmp为负时j指向当前元素后继并将tmp归零 
            {  
 				j=i+1;
				tmp=0;
            }  
        }  
        if(maxsum<0)              //输入的元素均为负,最大连续子序列和置为0 
			maxsum=0;  
        printf("%d %d %d\n",maxsum,a[start],a[end]);  
	}
	return 0;
}
程序截图:


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蓝桥杯是中国最大、最具影响力的计算机竞赛之一,每年都吸引了众多的参赛者。其中,Python研究生组是针对有一定编程基础和研究能力的大学生群体的比赛。以下是对蓝桥杯14届Python研究生组真题的解析。 本届比赛共有三个题目,分别是课程设计、文本处理和乘积关系。这些题目都要求参赛选手运用Python语言的各种特性和库来解决实际问题。 在课程设计题中,参赛选手需要通过读取输入的学生信息和课程信息来进行一系列的操作,例如统计某门课程的参与人数、计算学生的平均总成绩等。这个题目考察了对基本数据结构的使用和操作的熟练度。 在文本处理题中,参赛选手需要对一篇英文文章进行分词、词频统计等操作。这个题目考察了对字符串处理和文本处理的能力,同时也需要选手对Python的字符串操作和正则表达式的使用有一定的了解。 最后一个题目是乘积关系,参赛选手需要在一个给定的矩阵中找出乘积最大的连续子矩阵。这个题目考察了对二维数组的处理和算法思维的能力,需要选手能够设计出高效的算法来解决这个问题。 总体来说,蓝桥杯14届Python研究生组的真题设置合理,既考察了基本的编程能力,又考察了对Python语言特性的理解和应用。选手在解题过程中需要灵活运用各种数据结构、算法和库函数,并且要有良好的编程思维和问题分析能力。参加这样的比赛对于学生们的编程能力的提升和实践经验的积累都有着积极的促进作用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值