语法周赛 Round 21 题解
2024年12月25日大约 2 分钟
A. 计算 BMI
分析
- 难度:简单数学运算,难点主要在读题
- 子任务 1(30 分):输出样例即可。
- 子任务 2(30 分):保证了
为 1,输出体重和 , 即可。 - 子任务 3(40 分):BMI 的计算按照公式来就好,显然某个 BMI 指数对应的体重应该是:
。
满分参考代码
#include <bits/stdc++.h>
using namespace std;
double a, b;
int main()
{
cin >> a >> b;
cout << fixed << setprecision(8);
cout << b / a / a << "\n";
cout << 18.5 * a * a << " " << 24 * a * a << "\n";
return 0;
}
B. 零碎文件占用大小
分析
- 难度:循环,求和,主要难点还是读题。
- 子任务 1(30 分):保证了只有一个文件,计算这个文件占用空间就好,不用循环。显然空间占用就是考虑有几个整块,以及有没有多余的部分,简单检查除以
的余数是否为 即可。 - 子任务 2(30 分):最小单元为
KB,直接输出所有文件原始大小之和即可。 - 子任务 3(40 分):分别求解每个文件的空间占用然后求和即可。
满分参考代码
#include <bits/stdc++.h>
using namespace std;
int n, m;
int x, ans;
int main()
{
cin >> n >> m;
ans = 0;
for (int i = 1; i <= n; i++)
{
cin >> x;
ans += x / m;
if (x % m != 0)
ans++;
}
cout << ans * m;
return 0;
}
C. 科学记数法
分析
- 难度:模拟,主要难点还是读题。
- 子任务 1(30 分):显然直接输出字符串
,然后再输出*10^0
即可。 - 子任务 2(30 分):显然对于字符串
,输出x[0].x[1]~x[s.size()-1]\times 10^(x.size()-1)
即可。 - 子任务 3(40 分):注意到,题目规定了
大于等于 。容易发现,不管怎么样,都会输出字符串 中的所有数字字符。小数点只是用来判断最后乘以 的多少次方的。
满分参考代码
#include <bits/stdc++.h>
using namespace std;
string s;
int main()
{
cin >> s;
int num = 0;
for (int i = 0; i < s.size(); i++)
if (s[i] == '.')
break;
else
num++;
cout << s[0];
if (s.size() > 1)
cout << ".";
for (int i = 1; i < s.size(); i++)
if (s[i] != '.')
cout << s[i];
cout << "*10^" << num - 1 << "\n";
return 0;
}
D. 变大变大变成回文数
分析
- 难度:暴力枚举,数位分解。
- 子任务 1(30 分):不需要变化,输出
即可。 - 子任务 2(30 分):个位是
,那显然最少把个位变成百位上的数即可,最后答案就是所有数百位上的数之和。 - 子任务 3(40 分):暴力枚举每个数,然后再暴力枚举加多少能变成回文数即可。
满分参考代码
#include <bits/stdc++.h>
using namespace std;
int n, ai, ans;
bool f(int x)
{
if (1 <= x && x <= 9)
return true;
if (10 <= x && x <= 99)
return x % 10 == x / 10;
if (100 <= x && x <= 999)
return x % 10 == x / 100;
return true; // 其实没必要
}
int main()
{
cin >> n;
ans = 0;
for (int i = 1; i <= n; i++)
{
cin >> ai;
while (!f(ai))
{
ans++;
ai++;
}
}
cout << ans;
return 0;
}