蓝桥杯第十一届(第一场)C/C++ B题目及题解

目录

 

第一题:跑步训练

第二题:纪念日

第三题:合并检测

第四题:REPEAT程序

第五题:矩阵

第六题:整除序列

第七题:解码

第八题:走方格


第一题:跑步训练

蓝桥杯第十一届(第一场)C/C++ B题目及题解_第1张图片

答案:3880

注意:这是一个非常一节的问题,在考试的时候可能没有想的特别明白的话建议用程序跑一遍。因为我在自己做的时候做错了,然后自己用程序模拟了一遍这个训练,把数据都打印出来自然就明白了。

#include
using namespace std;

int main()
{
	int res, ans;
	int tt = 10000;
	
	int i;
	for(i = 1; ; i ++)
	{
		//此时是休息 
		if(i % 2 == 0)
		{
			tt += 300; 
			cout << "休息" << i << " " << tt << endl;  
		} 
		else 
		{//跑步一分钟
            tt -= 600; 
			cout << "跑步" << i << " " << tt << endl; 
		}
		 
	    if(tt < 0) break;
	}
	
	ans = i * 60 + tt / 10;
	cout << ans << endl;
	return 0;
} 

第二题:纪念日

蓝桥杯第十一届(第一场)C/C++ B题目及题解_第2张图片

答案:25038720  

注意:这个还是细节问题,日期注意是否是闰年。

#include
using namespace std;

bool isleap(int y)
{
	if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) return true;
	return false;
}
int main()
{
	int y1 = 1921, y2 = 2020;
	int days = 0; //记录天数
	 
	for(int i = y1 + 1; i <= y2; i++)
	{
		if(isleap(i)) days += 366;
		else days += 365;
	}
	
	days -= 22;
	
	cout << days << endl;
	
	long long ans = days * 24 * 60;
	cout << ans << endl;
	return 0;
}

第三题:合并检测

蓝桥杯第十一届(第一场)C/C++ B题目及题解_第3张图片

 

 

第四题:REPEAT程序

蓝桥杯第十一届(第一场)C/C++ B题目及题解_第4张图片

 

 

第五题:矩阵

蓝桥杯第十一届(第一场)C/C++ B题目及题解_第5张图片

 

第六题:整除序列

蓝桥杯第十一届(第一场)C/C++ B题目及题解_第6张图片

#include
using namespace std;

int main()
{
	long long n;
	cin >> n;
	
	while(n)
	{
		cout << n << " ";
		n /= 2;
	}
	
	return 0;
}

 

第七题:解码

蓝桥杯第十一届(第一场)C/C++ B题目及题解_第7张图片

#include
#include
#include
using namespace std;

int main()
{
	string str;
	cin >> str;
	
	stack res;
	
	for(int i = 0; i < str.size(); i++)
	{
		//不是数字的话先保留起来
		if(str[i] >= '0' && str[i] <= '9')
		{
			int k = str[i] - '0';
			for(int j = 1; j < k; j++) cout << res.top();
	    }
	    else
	    {
	    	//不是数字的话先保留起来并输出 
	    	res.push(str[i]);
	    	cout << str[i]; 
		}
	}
	
	return 0;
}

第八题:走方格

蓝桥杯第十一届(第一场)C/C++ B题目及题解_第8张图片

蓝桥杯第十一届(第一场)C/C++ B题目及题解_第9张图片

#include
#include
using namespace std;

const int N = 40;
int a[N][N];
int n, m, ans;

void dfs(int l, int r)
{
	if(l == n && r == n)
	{
		ans++;
		return;
	}
	
	if(l > n || n > m) return;
	
	//每次只能向右 或者向下走
	if(r + 1 <= m && ((r + 1) % 2 != 0 || l % 2 != 0)) dfs(l, r + 1);
	if(l + 1 <= n && ((l + 1) % 2 != 0 || r % 2 != 0)) dfs(l + 1, r); 
}
int main()
{
	scanf("%d %d", &n, &m);
	
	dfs(1, 1);
	
	printf("%d\n", ans);
	return 0;
}

第九题:

蓝桥杯第十一届(第一场)C/C++ B题目及题解_第10张图片

 暂时只能做出30%的吧,还不敢保证是绝对正确的,跪求大佬给出正确思路~~。

#include
#include
#include
#include
#include
using namespace std;

const int N = 100010;
int a[N];
int n, k, ans;

string to_string(int n)
{
	string str;
	stringstream ss;
	ss << n;
	ss >> str;
	return str;
} 
int main()
{
	scanf("%d %d", &n, &k);
	
	for(int i = 0; i < n; i++) scanf("%d", &a[i]);
	
	for(int i = 0; i < n; i++)
	{
		for(int j = i + 1; j < n; j++)
		{
			string str1, str2;
			str1 = to_string(a[i]);
			str2 = to_string(a[j]);
			
			int ans1;
			ans1 = a[i];
			for(int l = 0; l < str2.size(); l++)
			{
				ans1 = ans1 * 10 + (str2[l] - '0');
			}
			
			if(ans1 %  k == 0)
			{
//				cout << ans1 << " ";
                ans++;
	        }
			
			ans1 = a[j];
			for(int l = 0; l < str1.size(); l++)
			{
				ans1 += ans1 * 10 + (str1[l] - '0');
			}
			
			if(ans1 %  k == 0)
			{
//				cout << ans1 << " ";
				ans++;
			}
		}
	}
	
	
	cout << ans << endl;
	return 0;
}

有些题还不会哈,题解都看的有点迷迷糊糊的,今后努力~~

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