【周赛第66期】题目、解答与疑义

目录

      • 感想
  • 判断题
  • 1.
  • 单选题
    • 1.
    • 2.(有疑义)
  • 填空题
    • 1.
  • 编程题
    • 1.路灯亮度
      • 题目
      • 题解
      • 答案
    • 2.
      • 题目
      • 题解
      • 答案

感想

(吐槽)
在线IDE真不好用,不说不如CLion,抄一下leetcode的也好啊……

希望支持比赛时实时看别人通过了哪一题,类似ACM。目前不让跳出页面。

有一道单选题我对答案有不同看法。不过比赛前确实不熟悉IEEE 754。

编程题不给数据范围,让人纠结写适用范围小但好写的,还是范围大但难写的。

判断题

1.

使用n位定点数编码方案,最多能够表示的数值个数为2ⁿ个。但是,这些数值中可以包括小数。
A. 对
B. 错

答案是A,可以是定点小数,当然点是指二进制表示中的小数点。

单选题

1.

在同时涉及极大和极小浮点数值的算法中,以下哪一种在需要保证可靠性和性能的平衡时不是需要采取的策略?
A、避免在一次运算中同时涉及极大的绝对值和极小的绝对值的数值
B、先粗调,再精调
C、为保证可靠性,必须精益求精而不能进行粗调
D、对进行计算的数值进行预处理,比如可以先对其取对数

“不是”应该选C,因为“保证可靠性和性能的平衡时”,要考虑性能。

2.(有疑义)

使用IEEE754标准,可以准确地表示以下哪个数值?
A、1E310
B、-3.1415926535897932384626
C、0
D、以上都不对

答案给的是D,我选的是C。

#include

using namespace std;


int main() {
    double a = +0.0;
    double b = -0.0;
    double c = 0.0;
    cout << a << endl;
    cout << b << endl;
    cout << c << endl;
    if (a == b) {
        cout << "a == b" << endl;
    } else {
        cout << "a != b" << endl;
    }
    if (a == c) {
        cout << "a == c" << endl;
    } else {
        cout << "a != c" << endl;
    }
    if (b == c) {
        cout << "b == c" << endl;
    } else {
        cout << "b != c" << endl;
    }

    if (a == 0.0) {
        cout << "a == 0.0" << endl;
    }
    if (b == 0.0) {
        cout << "b == 0.0" << endl;
    }
    if (c == 0.0) {
        cout << "c == 0.0" << endl;
    }

    if (a == -0.0) {
        cout << "a == -0.0" << endl;
    }
    if (b == -0.0) {
        cout << "b == -0.0" << endl;
    }
    if (c == -0.0) {
        cout << "c == -0.0" << endl;
    }

    return 0;
}



GNU 13.1.0, C++17

输出是:

0
-0
0
a == b
a == c
b == c
a == 0.0
b == 0.0
c == 0.0
a == -0.0
b == -0.0
c == -0.0

什么叫做“可以准确地表示”,这算不算?
因为0不论存成+0还是-0都没有丢失信息,而且+0和-0相等,算不算“可以准确地表示”?
当然我没完整看过C++对IEEE754标准的实际实现情况,也许会对-0有一些特殊处理,但题目中的0应该会被存成+0,没有不准确。

填空题

1.

信息的动态范围和()是一对矛盾,根据不同的应用平衡二者的关系,是信息编码的艺术。

答案:精度

我比赛前真没看过书,但是答对了。这个似乎不是人工评判?!
意思就是说同样的数据量,可以表示范围大但间隔也大的一个数据集,也可以表示范围小但间隔也小的数据库,其实就是判断题1另一种问法。

编程题

1.路灯亮度

题目

有一条长度为n米的街道,上面分布着一些亮度不等的路灯。每离开某盏路灯1米,该位置受该盏路灯影响的亮度就比该盏路灯的原始亮度减少1个单位,而某个特定位置的最终亮度则等于所有影响该位置的路灯亮度的最大值,而亮度的最小值为0。

题解

在长度n的路上,给出m个路灯的位置和亮度,在一个点看路灯的亮度是 路灯本身的亮度 减去 距离,最小为0,一个点实际的亮度是所有路灯亮度的最大值,然后是若干个查询问指定点的亮度。

没给数据范围,直接暴力过了,就没再改。

答案

比赛时写的代码,凑合看吧……

#include
#include
#include

using namespace std;
const int N = 1001000;
struct Light {
    int pos, light;
} light[N];
struct Query {
    int id, pos;
} query[N];

int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int p, l;
        scanf("%d%d", &p, &l);
        light[i].pos = p;
        light[i].light = l;
    }
    int pos;
    //int tot = 0;
    while (scanf("%d", &pos) != EOF) {
        using LL = long long;
        LL ans = 0;
        for (int i = 0; i < m; i++) {
            int cha = abs(light[i].pos - pos);
            if (cha > light[i].light) { 
                ;
            } else {
                ans = max(ans, (LL) light[i].light - cha);
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}


2.

题目

某地有n个池塘,编号为i的池塘最大容积为i(从1开始编号),一开始都没有水。每天的天气状况决定了所有水池同时的水量变化,如果某天下了容积为v的雨表示所有池塘都会增加容积v的水,当然池塘满了的话水就会溢出而流走,不会影响到次日以后。如果某天天气炎热而蒸发了容积为v的水表示所有池塘都会减少容积v的水,当然池塘最多把所有水蒸发干而变成容积为0,也不会影响到次日以后。

题解

没想出正解,暴力90%,第2个点超时。
应该是同样是暴力中得分高的。

答案

#include
#include
#include

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector now(n + 1);
    for (int i = 0; i < m; i++) {
        int x;
        scanf("%d", &x);
        using LL = long long;
        LL ans = 0;
        if (x < 0) {
            for (int j = 1; j <= n; j++) {
                now[j] = now[j] + x < 0 ? 0 : now[j] + x;
                ans += now[j];
            }
        }
        else {
            for (int j = 1; j <= n; j++) {
                now[j] = now[j] + x > j ? j : now[j] + x;
                ans += now[j];
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}

你可能感兴趣的:(CSDN周赛,c++,算法)