第五届A组蓝桥杯决赛

历年蓝桥杯决赛题目汇总?

1、标题:海盗分金币

    有5个海盗,相约进行一次帆船比赛。

    比赛中天气发生突变,他们被冲散了。

    恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,

觉得自己是第一个经过该岛的人。

    第一个人在沙滩上发现了一堆金币。他把金币分成5等份。

发现刚好少一个金币。他就从自己口袋拿出一个金币补充进去,

然后把属于自己的那份拿走。

    第二个到达的人也看到了金币,他也和第一个人一样,

把所有金币5等分,发现刚好缺少一个金币,于是自己补进去一个,

拿走了属于自己的那份。

    第三,第四,第五人的情况一模一样。

    等他们到了目的地,都说自己的情况,才恍然大悟,

一起去荒岛找金币,然而再也没有找到荒岛。他们都惋惜地说:岛上还有一千多枚金币呢!
    
    请你根据这些信息,推算荒岛上最初有多少金币?

    这是一个整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)

逆推:枚举最后剩下的1000到1999个金币,向上还原,每次的硬币要能够被4整除。

#include
#include
using namespace std;
typedef long long ll;
#define M 1000000000

void dfs(ll k,ll n,int step){
	if(step==5){
		cout<

答案:3129


2、标题:六角幻方

    把 1 2 3 ... 19 共19个整数排列成六角形状,如下:

    * * *
   * * * *
  * * * * *
   * * * *
    * * *

    要求每个直线上的数字之和必须相等。共有15条直线哦!

    再给点线索吧!我们预先填好了2个数字,第一行的头两个数字是:15 13,、

参见图【p1.png】,黄色一行为所求。

第五届A组蓝桥杯决赛_第1张图片

    请你填写出中间一行的5个数字。数字间用空格分开。

    这是一行用空格分开的整数,请通过浏览器提交答案,不要填写任何多余的内容(比如说明性的文字等)

题目分析:如图所示,我们应该构建5行9列的数组

第五届A组蓝桥杯决赛_第2张图片

在如图所示,横着5条直线和我红色标识的左斜5条直线,右斜5条直线,每条直线的和相等,因为所填数字是1~19,和为390,

390/5=38,所以每条直线的和要为38。

第五届A组蓝桥杯决赛_第3张图片

(题目本身不难,但是这道题我做了很久!!!因为条件判断有误,递归出口出了问题,然后判断斜线的时候只算了3条,太粗心了!!!一定要细心啊啊啊啊啊 啊啊啊啊啊啊)

#include
using namespace std;
#define M 38
int arr[5][9];
int num[17]={1,2,3,4,5,6,7,8,9,10,
			11,12,14,16,17,18,19};
int vis[20];
bool is(int x,int y,int &x1,int &y1){ //x,y表示当前行和列,x1,y1表示下一次遍历的行和列 
	//判断横着的直线是否符合条件
	bool flag=true;
	if(y-x==6||x==2&&y==7||x==4&&y==6){
		int s=0;
		for(int i=0;i<9;i++){
			s+=arr[x][i];
		}
		if(s!=M)
			return false;
		x1=x+1;
		if(x1==1||x1==3) //判断直线,即是当前行的最后一列了,所以到下一步要换行,这里换行要分开讨论 
			y1=1;
		if(x1==2)
			y1=0;
		if(x1==4)
			y1=2;
		flag=false;//标识,表示已经换行了,避免后面再次给x1,y1赋值 
	} 
	//判断左斜着的值线
	 if(x-y==2||x==4){
	 	int s=0,xx=x,yy=y;
	 	while(xx>=0){
	 		s+=arr[xx--][yy++];
	 	}
	 	if(s!=M)
	 		return false;
	 }
	 //判断右斜着的直线
	 if(x==2&&y==8||x==3&&y==7||x==4&&(y==6||y==4||y==2)){	 	
	 	int s=0,xx=x,yy=y;
	 	while(xx>=0){
	 		s+=arr[xx--][yy--];
	 	}
	 	if(s!=M)
	 		return false;
	 } 
	 if(x==4){
	 		
	 }
	 if(flag)//如果前面没有换行,因此在当前行跳过一个空格 
		 y1=y+2,x1=x;
	 return true;
}	//9 6 5 2 16
void dfs(int x,int y){
	if(x==4&&y==6){
		for(int i=0;i<9;i+=2){
			cout<

答 案 :  9 6 5 2 16
3、标题:日期差

 历史上,不同的人类聚居地可能有不同的历法,因而记录下来的资料中日期的换算就很麻烦。

幸好今天我们统一使用公元纪年法。当然,这种历法对求两个日期差多少天也不是十分简便,

但毕竟是可以忍受的。

    下面的程序计算了两个日期的差值,两个日期都使用公元纪年法。

    请分析程序逻辑,并推断划线部分缺失的代码。

int to_day(int y, int m, int d)
{
    int mon[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int day = 0;
    int i;
    for(i=1; i         day += (i%4==0 && i%100!=0 || i%400==0)? 366 : 365;
    }
    
    if(y%4==0 && y%100!=0 || y%400==0) mon[2]++;
    
    for(i=1; i         _____________________;  //填空位置
    }
    
    return day + d;
}

int diff(int y1, int m1, int d1, int y2, int m2, int d2)
{
    int a = to_day(y1, m1, d1);
    int b = to_day(y2, m2, d2);
    return b-a;
}

int main()
{
    int n = diff(1864,12,31,1865,1,1);
    printf("%d\n", n);
    return 0;
}

注意:通过浏览器提交答案。只填写缺少的内容,不要填写任何多余的内容(例如:说明性文字或已有符号)。

#include
using namespace std;

int to_day(int y, int m, int d)
{
	int mon[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	int day = 0;
	int i;
	for(i=1; i

答案:day+=mon[i];

4、标题:排列序数

   如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:
  abcd  0
  abdc  1
  acbd  2
  acdb  3
  adbc  4
  adcb  5
  bacd  6
  badc  7
  bcad  8
  bcda  9
  bdac  10
  bdca  11
  cabd  12
  cadb  13
  cbad  14
  cbda  15
  cdab  16
  cdba  17
  ...

    现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?

【输入格式】
一行,一个串。

【输出格式】
一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。

例如:
输入:
bdca

程序应该输出:
11

再例如:
输入:
cedab

程序应该输出:
70

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


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

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

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

AC代码:

#include
#include
#include
using namespace std;
char arr[100];

int main(){
	cin>>arr;
	int n=strlen(arr);
	int ans=0;
	char temp[100];
	strcpy(temp,arr);
	sort(temp,temp+n);
	do{
		ans++;
		if(strcmp(temp,arr)==0){
			cout<

5、


标题:重复模式

    作为 drd 的好朋友,技术男 atm 在 drd 生日时送给他一个超长字符串 S 。

atm 要 drd 在其中找出一个最长的字符串 T ,使得 T 在 S 中至少出现了两次,

而他想说的秘密就藏在 T 中。

    由于字符串实在是太长了,drd 总是找不到合适的 T 。

于是 drd 请你帮他找到这个 T 的长度。

【输入格式】
一行。一个字符串,即题目中说的S 。

【输出格式】
一行。一个整数,表示最长的 T 的长度。

【样例输入】
ababa

【样例输出】
3

「数据范围」
对于 30% 的数据,S长度 <= 100
对于 60% 的数据,S长度 <= 8000
对于 100% 的数据,S长度 <= 500000

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


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

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

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

#include
#include
#include
using namespace std;

string s;
int mmax=0;
int len;

void dfs(int beg,int end){
	int n=end-beg;
	string s1=s.substr(beg,n);
	for(int i=beg+1;i>s;
	len=s.length();
	for(int i=0;i

6、标题:供水设施

 X星球的居民点很多。Pear决定修建一个浩大的水利工程,

以解决他管辖的N个居民点的供水问题。现在一共有N个水塔,

同时也有N个居民点,居民点在北侧从1号到N号自西向东排成一排;

水塔在南侧也从1号到N号自西向东排成一排。

    N条单向输水线(有水泵动力),将水从南侧的水塔引到北侧对应的居民点。

    我们不妨将居民点和水塔都看做平面上的点,居民点坐标为(1,K)~(N,K),

水塔为(1,0)~(N,0)。

    除了N条纵向输水线以外,还有M条单向的横向输水线,

连接(Xi,Yi)和((Xi)+1,Yi)或者(Xi,Yi)和((Xi)-1,Yi)。前者被称为向右的水路,

而后者是向左的。不会有两条水路重叠,即便它们方向不同。

    布局的示意图如:【p1.png】所示。

第五届A组蓝桥杯决赛_第4张图片

    显然,每个水塔的水都可以到达若干个居民点(而不仅仅是对应的那个)。

例如上图中,4号水塔可以到达3、4、5、6四个居民点。

    现在Pear决定在此基础上,再修建一条横向单向输水线。为了方便考虑,

Pear认为这条水路应当是自左向右的,也就是连接了一个点和它右侧的点

(例如上图中连接5和6两个纵线的横向水路)。

    Pear的目标是,修建了这条水路之后,能有尽可能多对水塔和居民点之间能到达。

换句话说,设修建之后第i个水塔能到达Ai个点,你要最大化A1+A2+...+An。

    根据定义,这条路必须和X轴平行,但Y坐标不一定要是整数。注意:

虽然输入中没有重叠的水路,但是你的方案可以将新修的输水线路与已有的水路重叠。

【输入数据】
    输入第一行包含三个正整数N,M,K,含义如题面所述:N是纵向线数,

M横向线数,K是居民点纵坐标。

    接下来M行,每行三个整数。前两个正整数Xi Yi表示水路的起点坐标;
    1<=Xi<=N,0     接下来一个数0或者1,如果是0表示这条水路向左,否则向右。
    保证水路都是合法的,也就是不会流向没有定义的地方。

【输出数据】
输出一行。是一个正整数,即:题目中要求的最大化的A1+A2+...+An。

【输入样例1】
4 3 2
1 1 1
3 1 0
3 1 1
【输出样例1】
11

【输入样例2】
7 9 4
2 3 0
7 2 0
6 3 1
6 1 0
2 1 1
3 3 1
5 2 0
2 2 1
7 1 0
【输出样例2】
21

【数据范围】
对于20%的数据,N,K<=20,M<=100
对于40%的数据,N,K<=100,M<=1000
对于60%的数据,N,K<=1000,M<=100000
对于100%的数据,N,K<=50000,M<=100000

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


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

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

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include , 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

 

你可能感兴趣的:(蓝桥杯)