这场其实难度很低,主要考查一个细心和阅读能力。

我题解先只给个简单的,如果哪题反馈比较多看不懂我的代码、不会的话,我再抽空补一个视频题解。

月名排序

题目怎么说,我们就怎么做。

#include <bits/stdc++.h>
using namespace std;
string month[13] = {
    "",
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"};
string new_month[13];
string in_month;
int main()
{
    freopen("month.in", "r", stdin);
    freopen("month.out", "w", stdout);
    for (int i = 1; i <= 12; i++)
        new_month[i] = month[i];
    sort(new_month + 1, new_month + 12 + 1);
    cin >> in_month;
    for (int i = 1; i <= 12; i++)
        if (in_month == new_month[i])
            cout << month[i];
    return 0;
}

第一是谁

题目怎么说,我们就怎么做。因为数据范围给得很小,所以完全不用什么 map 呀或者优先队列啊啥的。咱老老实实好好写好暴力就好了。

#include <bits/stdc++.h>
using namespace std;
int n, m;
string nam[1005];
int score[1005][5];
int main()
{
    freopen("top.in", "r", stdin);
    freopen("top.out", "w", stdout);
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> nam[i];
    sort(nam + 1, nam + n + 1);
    while (m--)
    {
        int op, a, b;
        string s;
        cin >> op;
        if (op == 1)
        {
            cin >> s >> a >> b;
            for (int i = 1; i <= n; i++)
                if (s == nam[i])
                    score[i][a] = b;
        }
        if (op == 2)
        {
            s = nam[1];
            a = score[1][1] + score[1][2] +
                score[1][3] + score[1][4];
            for (int i = 2; i <= n; i++)
            {
                if (score[i][1] + score[i][2] +
                        score[i][3] + score[i][4] >
                    a)
                {
                    s = nam[i];
                    a = score[i][1] + score[i][2] +
                        score[i][3] + score[i][4];
                }
            }
            cout << s << "\n";
        }
    }
    return 0;
}

随机重复

出题时突然想到之前 30 场语法周赛似乎都没有卡过空间。于是想出一道卡空间限制的题,就有了这道题。

注意到这题空间限制只有 6464 MiB,开 10710^7unsigned long long107×8/1024/10247710^7\times 8 / 1024/1024\approx 77 MiB 了。所以不能存下来每个随机数。很多同学被我卡到了。

注意到了这个就很容易想到每个随机数都去看看再 a1ama_1\sim a_m 中有没有出现过就可以了。时间复杂度 O(nlogm)O(n\log{m}) 我给了标程两倍以上的时间,足够了。

#include <bits/stdc++.h>
using namespace std;
unsigned long long seed;
unsigned long long rnd()
{
    seed = seed * seed + seed + 30ull;
    return seed;
}
int n, m;
unsigned long long a[100000 + 5];
bool vis[100000 + 5];
int main()
{
    freopen("random.in", "r", stdin);
    freopen("random.out", "w", stdout);
    cin >> seed >> n >> m;
    for (int i = 1; i <= m; i++)
        cin >> a[i];
    sort(a + 1, a + m + 1);
    for (int i = 1; i <= n; i++)
    {
        unsigned long long now = rnd();
        int pos = lower_bound(a + 1, a + m + 1, now) - a;
        if (pos == m + 1)
            continue;
        if (a[pos] == now)
            vis[pos] = true;
    }
    int ans = 0;
    for (int i = 1; i <= m; i++)
    {
        if (vis[i])
            ans++;
        if (i != m && a[i] == a[i + 1])
            vis[i + 1] = vis[i];
    }
    cout << ans;
    return 0;
}

三三音乐

读懂题意后,按题意模拟就好了。只有一个坑点,直接套数学式子算的话,万一有 2000020000 这个浮点数会量化编码为 2b2^b,而根据题意只能量化编码为 2b12^b-1

我比较仁慈,这块没有绑定子任务依赖,所以没有注意到这个的应该也只会丢 1010 分。

最后代码非常短。

#include <bits/stdc++.h>
using namespace std;
const double L = 16;
const double R = 20000;
int a, t, b, n;
double info[100000 + 5];
int info_int[100000 + 5];
int main()
{    
    freopen("music.in", "r", stdin);
    freopen("music.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> a >> t >> b;
    n = a * t;
    for (int i = 1; i <= n; i++)
        cin >> info[i];
    // 这一部分也可以直接生成 2^b 个分界点然后二分
    // 我直接数学方法算了
    double p = (R - L) / (1 << b);
    for (int i = 1; i <= n; i++)
    {
        info_int[i] = (info[i] - 16) / p;
        if (info_int[i] == (1 << b))
            info_int[i]--;
    }
    // 可以转为二进制输出
    // 我直接位运算处理了
    for (int i = 1; i <= n; i++)
        for (int j = b - 1; j >= 0; j--)
            cout << ((info_int[i] >> j) & 1);
    return 0;
}

0 条评论

目前还没有评论...