C++省赛B组个人题解(部分)
试题A:空间
题目
答案:67108864
分析
计算机组成原理题,一上来就栽跟头了。。。
1byte=8bits,Bit意为"位"或"比特",是计算机运算的基础;
Byte意为"字节",是计算机文件大小的基本计算单位;
8个二进制位构成1个"字节(Byte)",即1Byte=8bit
所以1个32位二进制数占4个Byte。
答案为
试题B:卡片
题目
答案:3181
分析
打卡题
#include <bits/stdc++.h>
using namespace std;
int a[10];
bool ok(int x) //每个数消耗卡片
{
while(x)
{
int temp = x % 10;
if(a[temp])
{
a[temp]--;
x /= 10;
}
else
return 0;
}
return 1;
}
int main()
{
fill(a, a + 10, 2021); //总共的卡片数
for (int i = 1;; i++)
{
if(ok(i))
continue;
else
{
cout << i - 1;
break;
}
}
return 0;
}
试题C:直线
题目
答案:40257
分析
一看像个数学题,可是又推不出数学公式,然后就分三种情况讨论,哈希统计个数,测试样例和自己测试的小样例都过了,不过好像数据大了,double精度不够用,因此需要调用2个坐标,求b,才能得到正确解
1.平行于y轴 直线表达式为x=???
2.平行于x轴 直线表达式为y=???
3.普通一次函数 直线表达式为y=kx+b
#include <bits/stdc++.h>
using namespace std;
set<pair<double, double> > ss; //普通的直线
set<double> dx,dy; //两种特殊的直线
struct point
{
double x, y;
};
void solve(point a,point b)
{
if(a.x==b.x) //平行于y轴
dx.insert(a.x);
else if(a.y==b.y) //平行于x轴
dy.insert(a.y);
else //计算表达式y=kx+bb
{
double k = (b.y - a.y) / (b.x - a.x);
// double bb = a.y - k * a.x; //错误解
//正解 运用两个点的坐标提升精度
double bb = (a.y * b.x - a.x * b.y) / (b.x - a.x);
ss.insert(pair<double, double>(k, bb));
}
}
int main()
{
vector<point> v;
for (int i = 0; i <= 19;i++)
{
for (in