Loading

题解 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 时不需要输入空格,会自动过滤。

  • 关于变量命名:x1x2bits/stdc++.h 库下的变量名,会引起命名冲突。这里改成 x_1x_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

此外关于 ifswitch,一般常用 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

按题意模拟即可,多出来的糖果可以直接认为消失了,不需要考虑,于是直接使用整数除法向下取整。

posted @ 2024-10-01 20:31  Merlin_Meow  阅读(81)  评论(4)    收藏  举报
Sakana Widget 自定义角色自适应示例