20250829模拟赛游记

· · 生活·游记

20250829 模拟赛游记

比赛介绍:

  • 本次比赛共五题,时长 3 小时,难度正常(对我来说)
  • 比赛时间为 2025829 日早上八点半至十一点半。
  • 需要写文件读写(CSP 标准)

    试题分析

    1. 比赛时间(ctiming)

    题目内容:

  • 已知比赛开始时间为 111111 分。
  • 现输入三个正整数分别表示比赛结束日,时,分。
  • 计算比赛持续时间。

我的解法:

#include <bits/stdc++.h>
#define int long long 
using namespace std;

int d, h, m;

signed main() {
    cin >> d >> h >> m;
    cout << (d >= 12 ? (13 + h) * 60 - 11 + m : max((h - 11) * 60 + (m - 11), -1ll));
    return 0;
}

正解:

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
ll d, h, m;

int main() {
    cin >> d >> h >> m;
    if(d * 10000 + h * 100 + m < 111111) {
        cout << -1;
        return 0;
    }
    d -= 11;
    h += d * 24;
    h -= 11;
    m += h * 60;
    m -= 11;
    cout << m;
    return 0;
}

此题看出的问题:

  1. 犹豫时间过长,不能静心计算。
  2. 计算能力有待提高

2. 负载均衡(balancing)

题目内容:

  • 给出几头奶牛的坐标。
  • 将这几头奶牛分成尽量均衡的四份。
  • 求这四块栅栏里的最大值的最小值。

此题基本算法:\ 考验代码模拟能力

此题看出的问题:

  1. 模拟能力不强(多做模拟题)
  2. 优化能力不强

3. 礼物(gifts)

题目大意:

  • 要给一些奶牛买礼物,有预算一些钱
  • 有一张优惠券,可以用半价购买
  • 求最多可以为多少头奶牛买礼物

此题基本算法:\ 考验代码模拟能力,贪心排序

正解:

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1005;
int n, b, f;

struct gifts {
    int p, s;
} g[N];

int cmp (gifts a, gifts b) {
    return a.p + a.s < b.p + b.s;
}

signed main() {
//  freopen("gifts.in", "r", stdin);
//  freopen("gifts.out", "w", stdout);
    cin >> n >> b;
    for (int i = 1; i <= n; i++) {
        cin >> g[i].p >> g[i].s;
    }
    stable_sort(g + 1, g + n + 1, cmp);
    int sum = 0, ans = 0;;
    for (int i = 1; i <= n; i++) {
        if (sum + (g[i].p + g[i].s) <= b) {
            sum += (g[i].p + g[i].s);
            ans++;
        } else {
            if (sum + (g[i].p / 2 + g[i].s) <= b && !f) {
                f = 1;
                ans++;
            }
        }
    }
    cout << ans;
    return 0;
}

4. 堆干草(stacking)

题目大意:

  • 有几次操作,每次操作往一些干草堆中加入一个单位的干草
  • 排序后,求这几堆干草的中位数

此题基本算法:\ 考验代码模拟能力,差分(一维)排序

正解:

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const int N = 1e6 + 5;
ll n, k, s[N];

int main() {
    cin >> n >> k;
    for(int i = 1, a, b; i <= k; i++) {
        cin >> a >> b;
        s[a] += 1, s[b + 1] -= 1;
    }
    for(int i = 1; i <= n; i++) s[i] += s[i - 1];
    sort(s + 1,s + n + 1);
    cout << s[n / 2 + 1];
    return 0;
}

此题反映的问题:

  1. 差分不熟悉

5. 放牧模式(grazing)

题目大意:

  • 有两头奶牛在草地上吃草
  • 草地上有一些贫瘠的土地
  • 奶牛所走的每一格都是草地
  • 求有多少种方案最后两头奶牛在一个格子上

算法:

  1. DFS
  2. 模拟

反应的问题:

  1. 对于 DFS 题不熟悉,导致做题出错。
  2. 模拟能力不强

大总结

  • 加强模拟能力,做好题,好做题,做题好。
  • 复习学过的算法,DFS, BFS 等
  • 认真听懂每一道题

    最后的最后

    谢谢大家,以及老师的悉心栽培! 最后,别忘了给 Love_Star 一个关注,谢了ヾ(o′▽`o)ノ°°谢谢