题解 HZOI 普及 国庆假期作业
Part.I 前言
为了防止诸位现役 OIer 在开学以后因为讲题折寿,我写了这篇题解。
仅此而已。
Part.II 题解
A
题面含义很显然,而且很贴心地,公式给成了 C++ 语言的样式,可以直接复制粘贴。
这里先贴出代码,然后按照代码讲解一些注意事项。
#include <bits/stdc++.h>
using namespace std;
int main() {
double a, b, c, x_1, x_2;
cin >> a >> b >> c;
x_1 = (-b + sqrt(b * b - 4 * a * c)) / (2 * a);
x_2 = (-b - sqrt(b * b - 4 * a * c)) / (2 * a);
printf("%.2lf %.2lf", x_1, x_2);
return 0;
}
-
注意到方程的根为实数,所以这里全部变量都用
double类型存储。 -
cin时不需要输入空格,会自动过滤。 -
关于变量命名:
x1,x2是bits/stdc++.h库下的变量名,会引起命名冲突。这里改成x_1,x_2以避免冲突,并且在公式书写中该种写法表示下标,如 \(x_1\)。
B
一个显然的思路是,枚举所有 \(a,b,c\) 之间可能的大小关系,然后输出。但是肯定有人嫌弃这个思路太麻烦不想写。所以考虑如下思路:
将 \(a\) 和 \(b,c\) 分别比较,使 \(a\) 为三数中最大值,类似地,让 \(b\) 为 \(b,c\) 中最大值,最后输出剩下的 \(c\)。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
if (a > b)
swap(a, b);
if (a > c)
swap(a, c);
if (b > c)
swap(b, c);
cout << a << " " << b << " " << c << endl;
return 0;
}
C
按题意模拟,两个条件同时满足时,同时更新当前上课的最长时间以及那一天的天数。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, maxn = -1, maxi = 0;
for (int i = 1; i <= 7; i++) {
cin >> a >> b;
if (a + b > 8 && a + b > maxn) {
maxn = a + b;
maxi = i;
}
}
cout << maxi << endl;
}
值得注意的两点是:
-
maxn的初值应该小于a+b的值域,这里赋为 \(-1\)。 -
由于要求输出靠前的一天,判断条件应该写成
>,原因自己思考。
D
#include <bits/stdc++.h>
using namespace std;
int main() {
int y, m;
cin >> y >> m;
if (m == 2) {
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
cout << 29 << endl;
else
cout << 28 << endl;
} else {
if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 ||
m == 12)
cout << 31 << endl;
else
cout << 30 << endl;
}
return 0;
}
这里主要强调判断闰年的条件,应该写成:y % 4 == 0 && y % 100 != 0 || y % 400 == 0。
此外关于 if 和 switch,一般常用 if,可能是因为比较符合 C++ 语言的语法直觉?
E
#include <bits/stdc++.h>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
a /= 3, b += a, c += a;
b /= 3, a += b, c += b;
c /= 3, a += c, b += c;
cout << a << " " << b << " " << c << endl;
return 0;
}
Part.III 后记
祝各位早日 AK IOI。
Sol by Merlin_Meow
按题意模拟即可,多出来的糖果可以直接认为消失了,不需要考虑,于是直接使用整数除法向下取整。

浙公网安备 33010602011771号