第十二届蓝桥杯省赛部分题解(B组)

试题A:空间

在这里插入图片描述
解析
(一)
1B = 8 bit
1KB = 1024B
1MB = 1024KB
所以256MB占据256102410248个bit,一个元素占32bit,所以一共有
256
102410248/32 = 67108864

(二)
32位二进制为4字节相当于一个int,所以一共有
25610241024/4 = 67108864

试题B:卡片

哈哈哈

解析
思维题,注意输出时减一

题解

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int s[11];

bool check(int x){
	while(x){
		int t=x%10;
		x/=10;
		s[t]--;
		if(s[t]<0) return false;
	}
	return true;
}

int main(){
	for(int i=0;i<10;i++){
		s[i]=2021;
	}
	for(int i=1;;i++){
		if(!check(i)){
			cout<<i-1<<endl;
			return 0;
		}
	}
	return 0;
} 

3181

试题C:直线

在这里插入图片描述

解析

枚举出所有两两点构成的直线,再根据y = k * x + b 判断直线是否唯一
注意:1,k与x为浮点数计算,其比较时相差在1e-8间都默认相等
2,注意k不存在的情况,最后要将其补上

题解

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;

const int N = 2e5;
int n;

struct Line{
	double k,b;
	//结构体内镶排序,远快于cmp外部排序 
	bool operator< (const Line& t) const{
		if(k != t.k) return k < t.k;
		else return b < t.b;
	}
}l[N];

int main(){
	for(int x1 = 0;x1 < 20;x1 ++)
		for(int y1 = 0;y1 < 21;y1 ++)
			for(int x2 = 0;x2 <20;x2 ++)
				for(int y2 = 0;y2 < 21;y2 ++){
					//注意x1 != x2为K存在时 
					if(x1 != x2){
						double k = (double)(y2 - y1) / (x2 - x1);
						double b = y1 -k * x1;
						l[n ++] = {k, b};
					}
				}
	sort(l, l + n);
	int res = 1;
	for(int i = 1;i < n;i ++){
		//注意计算机计算浮点数会有误差,所以一般相差在1e-8之间认为两个浮点数相同 
		if(fabs(l[i].k - l[i-1].k) > 1e-8 || fabs(l[i].b - l[i - 1].b) > 1e-8)
			res ++;
	}
	cout << res + 20 << endl;
	return 0;
}

40257

试题D: 货物摆放

在这里插入图片描述

解析
吐槽一下,相对简单的一题,然而菜鸡却还是没有写出来

题解

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;
typedef long long ll;
const ll N = 2021041820210418;

vector<ll> g(ll N){
	//基础基础基础!!重要的事情说三遍 
	vector<ll> res;
	for(ll i = 1;i <= N/i;i ++){
		if(N % i == 0){
			res.push_back(i);
			if(i != N / i) res.push_back(N / i);
		}
	}
	//可有可无 
	sort(res.begin(), res.end());
	return res;
}



int main(){
	auto res = g(N);
	ll l = res.size();
	int ans;
	for(int i = 0;i < l;i ++){
		for(int j = 0;j < l;j ++){
			for(int k = 0;k < l;k ++){
				if(res[i]*res[j]*res[k] == N)
					ans++;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

2430

总结
第一次蓝桥杯,犯了很多低级错误,总的来说还是基础不牢,代码打的不够多,继续加油!!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值