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

本文分享了八道程序设计题的解答思路与代码实现,包括跑步训练的时间计算、纪念日的分钟数统计、矩阵操作等,强调了通过编程模拟解决复杂问题的重要性。

目录

 

第一题:跑步训练

第二题:纪念日

第三题:合并检测

第四题:REPEAT程序

第五题:矩阵

第六题:整除序列

第七题:解码

第八题:走方格


第一题:跑步训练

答案:3880

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

#include<iostream>
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;
} 

第二题:纪念日

答案:25038720  

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

#include<iostream>
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;
}

第三题:合并检测

 

 

第四题:REPEAT程序

 

 

第五题:矩阵

 

第六题:整除序列

#include<iostream>
using namespace std;

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

 

第七题:解码

#include<iostream>
#include<string>
#include<stack>
using namespace std;

int main()
{
	string str;
	cin >> str;
	
	stack<char> 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;
}

第八题:走方格

#include<iostream>
#include<algorithm>
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;
}

第九题:

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

#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<string.h>
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;
}

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

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值