第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

1.握手问题

思维:

对于第一个人来说 除了自己以外要跟其他49人握手 所以第一个是49 //对于第二个人来说 第一个人主动跟我握手了 有一次不算 所以第二个是48.。。 //以此类推 第43个人就是7 到了最后七个人呢 因为互相都没有握手 并且7个人都被前面的人握过手了 所以都是0

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
	int sum=0;
	for(int i=49;i>=7;i--)
	{
		sum+=i; 
	}
	cout<<sum<<endl;
	return 0;
}

2.小球反弹

想象延长矩形

#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
	int t=1,x=343720,y=233333;
	while(1)
	{
		if(15*t%x==0 && 17*t%y==0)
		{
			break;
		}
		t++;
	}
	printf("%.2lf",2*sqrt(15*t*15*t+17*t*17*t));
	return 0;
}

3.好数

模拟题,模拟题目意思即可

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,sum=0;
bool check(int x)
{
	vector<int>a;
	while(x>0)
	{
		a.push_back(x%10);
		x/=10;
	}
	for(int i=0; i<a.size(); i++)
	{
		if((i+1)%2!=0 && a[i]%2==0) //奇数位不为奇数 
		{
			return false; 
		}
		else if((i+1)%2==0 && a[i]%2!=0) //偶数位不为偶数 
		{
			return false; 
		}
	}
	return true;
}
signed main()
{
	cin>>n;
	for(int i=1; i<=n; i++)
	{
		if(check(i))
		{
			sum++;
		}
	}
	cout<<sum<<endl;
	return 0;
}

4.R 格式

 本身是高精度问题,不过我就会下面方法,能过(40%)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
long double d; 
signed main()
{
	cin>>n>>d;
	printf("%.Lf\n",pow(2,n)*d);
	return 0;
}

5.宝石组合

 推导公式,最后得出结论:s=gcd(Ha,Hb,Hc);   下面代码未进行优化时间复杂度

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,h[N];
vector<int>nums;
signed main()
{
	cin>>n;
	for(int i=0; i<n; i++)
	{
		cin>>h[i];
	}
	sort(h,h+n);
	int max1=0;
	for(int i=0; i<n; i++)
	{
		for(int j=i+1; j<n; j++)
		{
			for(int k=j+1; k<n; k++) //i,j,k
			{
				int t=__gcd(__gcd(h[i],h[j]),h[k]);
				if(t>max1)
				{
					nums.clear(); 
					max1=t;
					nums.push_back(h[i]);
					nums.push_back(h[j]);
					nums.push_back(h[k]);
				}
			}
		}
	}
	for(int i=0;i<nums.size();i++)
	{
		cout<<nums[i]<<" "; 
	}
	return 0;
}

6.拔河

//题目意思是可以选择一部分连续的同学(非全选)
//枚举所有队伍可能的值,排序后最小的 两相邻队伍的差值 即为结果(若两数的差最小,其排序后一定相邻) 
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[1010]; 
vector<int>nums; 
signed main()
{
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<n;i++)
	{
		int temp=0;
		for(int j=i;j<n;j++)  
		{
			temp+=a[j];
			nums.push_back(temp);
		}
	}
	sort(nums.begin(),nums.end());
	int min1=LONG_MAX;
	for(int i=1;i<nums.size();i++)
	{
		min1=min(min1,nums[i]-nums[i-1]); //两数的差最小,其排序后一定相邻
	}
	cout<<min1<<endl;
	return 0;
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值