蓝桥杯大赛历届真题 - C&C++ 大学 B 组 - 蓝桥云课 (lanqiao.cn)
题目描述1
题目分析
看见有32位,我们以此为入手点,
B代表字节1B = 8b
b代表位,32位即4个字节 (B)
1KB = 1024B
1MB = 1024KB
(256 * 1024 * 1024) / 4 = 67108864
故答案为67108864
题目描述2
题目分析
只需将0~9每个数组当成一类卡片,如果循环到的数字需要就可以将此减去。如果减到会小于0就输出此+1即可(答案3181)
cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int f[N], flag;
int main()
{
for(int i = 0; i <= 9; i ++)
{
f[i] = 2021;
}
for(int i = 1; ; i ++)
{
int x = i;
while(x)
{
int y = x % 10;
x /= 10;
if(f[y] > 0)f[y] --;
else
{
flag = i;
break;
}
}
if(flag)break;
}
cout << flag - 1;
return 0;
}
题目描述3
题目分析
注:要确定有多少条不同的直线,需要将相同的直线不算进去,我们可以进行暴力枚举,当其
x1 == x2 或者 y1 == y2是其斜率为垂直于X轴或者平行于X轴的直线这些线一共有41条,我们可以
将其放在最后相加,我们将所有的直线都枚举出来存入set中,set会自动去重,找出set中线的个数
即可。
思考:将直线存入set我们主要存的是斜率以及截距,斜率与截距确定一条直线y = kx + b
其斜率:(y2 - y1) / (x2 - x1)
我们计算截距的时候不能直接使用计算好的斜率进行计算,因为会损失精度造成错误
cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
typedef pair<double, double> PII;
set<PII> st;
int ans;
int main()
{
for(int x1 = 0; x1 <= 19; x1 ++)
{
for(int y1 = 0; y1 <= 20; y1 ++)
{
for(int x2 = 0; x2 <= 19; x2 ++)
{
for(int y2 = 0; y2 <= 20; y2 ++)
{
if(x1 == x2 || y1 == y2)continue;
double k = ((y2 - y1) * 1.0) / ((x2 - x1) * 1.0);
double b = ((x2 * y1 - x1 * y2) * 1.0) / ((x1 - x2) * 1.0);
st.insert({k, b});
}
}
}
}
ans = 41 + st.size();
cout << ans;
return 0;
}
故答案为40257