第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(前四道)

第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(前四道)


前言

今天来尝试b组!


提示:以下是本篇文章正文内容,下面案例可供参考

一、握手问题

50个人互相握手且不重复
那么第一个和剩下49个握手
第二个和剩下48握手
那么50个握手数枚举代码如下

for(int i=1;i<=50;i++)
	for(int j=i+1;j<=50;j++)
	sum++;

同理有7个人互不握手

for(int i=1;i<=7;i++)
	for(int j=i+1;j<=7;j++)
	sum--;

减去不握手的数量最后就是握手数量
完整代码如下

#include<iostream>
using namespace std;
int main()
{
	int sum=0;
	for(int i=1;i<=50;i++)
	for(int j=i+1;j<=50;j++)
	sum++;
	for(int i=1;i<=7;i++)
	for(int j=i+1;j<=7;j++)
	sum--;
	cout<<sum;
	return 0;
 } 

当然也可以用数学知识直接算出来在输出!
个人感觉这个相对于c组第一道更简单

二、小球反弹

反弹效果图如下
在这里插入图片描述
画出图后思路马上变清晰
重回左上角
那么就是
小球下来再弹回去的水平位移是长的整数倍
同样的宽同理
代码如下

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
	long long x,y;
	long long c=343720,k=233333;
	long long t=0;
	while(1)
	{
		t++;
		x=t*15;
		y=t*17;
		if((x%c==0&&(x/c)%2==0)&&(y%k==0&&(y/k)%2==0))
		{
			printf("%.2f",sqrt(x*x+y*y));
			break;
		}	
	}

至于为什么要判断(x/c)%2=0和(y/k)%2=0,那是因为一去一回才能回到上面,只有在上面才能回到左上角

三、好数

要求奇数位上的数是奇数,偶数位上的数是偶数
1.判断位数奇偶
2.判断位上的数奇偶
直接上代码

#include<iostream>
using namespace std;
int main()
{	
	int sum=0;
	int n;
	cin>>n;
	while(n)
	{
		int m=n;
		while(1)
		{
			if(m%2==1)m/=10;
			else break;
			if(m%2==0)m/=10;
			else break;
			if(m==0)
			{
				sum++;
				break;
			}
		}
		n--;
	}
	cout<<sum;
	return 0;
}

从末尾开始判断,只要出现不满足,即可直接跳出
时间复杂度呢
0<n<10七次方
里面最多进行6次
时间复杂度O(6n)炸不了

四、R 格式

题目给了50%数据让你暴力去算
不过我们就不暴力了
0<n<1000 2^n
肯定是long long 都装不下的
还有位数位为0-1024的浮点型
也肯定装不下
那么必须用高精度
什么是高精度呢
就是把一串特别大的数改成数组的形式来存储
用字符数组输入
再将字符数组转换成整型数组进行运算
因为是2的n次方
那我可以让转换出来的整型数组循环n次×2即可
期间我们记录小数点位置
把小数点移除运算结束再加入小数点
因为题目要求要四舍五入
那么我去找小数点后一位进行判断
舍去或进1
需要注意
如果进1,前一位大于10的处理
代码如下

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	int n;
	char a[10000];
	int b[10000]={};
	int c[10000];
	int k=0;
	cin>>n;
	scanf("%s",a);
	int sum=0,point;
	sum=strlen(a)-1;
	for(int i=0,j=strlen(a)-1;i<strlen(a);i++,j--)
	{
		if(a[i]=='.')
		{
			j++;
			point=strlen(a)-i-1;
			continue;
		}
		b[j]=int(a[i]-'0');
	}
	while(n)
	{
		n--;
		for(int i=1;i<=sum;i++)
		{
			b[i]*=2;
			b[i]+=k;
			k=0;
			if(b[i]>=10)
			{
				k+=b[i]/10;
				b[i]%=10;
				if(i==sum)sum++;
			}
		}
	}
	if(b[point]>=5)
	{
		int x=point;
		b[x+1]+=1;
		while(b[x+1]==10)
		{
			b[x+1]=0;
			x++;
			b[x+1]+=1;
		}
	}
	for(int i=sum;i>=1;i--)
	{
		if(i==point)break;
		cout<<b[i];	
	}
	return 0;
}

很多细节需要在写的时候调整和修改,可以边写边输出,看看自己得到的数组对不对

总结

第一道 概率论题
第二道 要把图画出来,然后就很清晰了
第三道 分支判断
第四道 高精度运算,模板问题

### 关于第十五届蓝桥杯2024 C/C++ A大学软件的信息 #### 比题目概述 根据已有的信息,第十五届蓝桥杯软件C/C++大学A的比题目尚未完全公开。然而,在某些参者的分享中提到,部分试题涉及算法设计与优化[^1]。例如,“合法密码”问题是其中的一道典型考题,其核心在于字符串处理和合法性验证逻辑的设计[^2]。 #### 时间复杂度的要求 对于一些具体问题,如图论相关的内容,时间效率成为评判标准之一。有记录显示,针对特定类型的输入数据结构(比如边的关系),即使采用较为基础的双重循环实现方法,也能满足竞设定的时间限制——通常为3秒以内完成运算[^3]。 #### 参加者的学习计划建议 为了更好地备战此类事,一位昵称为“牛友”的选手提出了自己的学习规划:利用假期集中精力复习数学基础知识,并通过参与各类线上编程挑战来积累实战经验,目标是从当学科成功转换至计算机科学领域继续深造。 ```cpp // 示例代码片段展示如何判断简单条件下的合法密码 bool isValidPassword(const std::string& password){ bool hasUpper = false; bool hasLower = false; bool hasDigit = false; if(password.length() < 8 || password.length() > 16) return false; for(char c : password){ if(isupper(c)) hasUpper=true; else if(islower(c)) hasLower=true; else if(isdigit(c)) hasDigit=true; // 假设不允许特殊字符作为简化版规则的一部分 if(!isalnum(c)) return false; } return (hasUpper && hasLower && hasDigit); } ``` 上述函数仅为示意性质,实际比中可能需要考虑更复杂的约束条件以及边界情况测试。 #### 总结 综上所述,参加蓝桥杯这样的高水平程序设计大赛不仅考验选手的技术功底,还需要合理安排训练周期并不断调整策略适应新变化。希望每位热爱编码的人都能在这一过程中收获成长!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值