A 颜色

标程

#include <iostream>
using namespace std;

int main() {
    int a1, a2, a3, a4, a5;
    cin >> a1 >> a2 >> a3 >> a4 >> a5;

    int sum = a1 + a2 + a3 + a4 + a5;

    if (sum <= 99) cout << "Grey";
    else if (sum <= 119) cout << "Blue";
    else if (sum <= 169) cout << "Green";
    else if (sum <= 229) cout << "Orange";
    else cout << "Red";

    return 0;
}

B.萌兔考场大作战🐰✨

思路

必须从第 1 个考场开始,连续使用考场。

每个考场的容量为: ri×cir_i \times c_i

我们从前往后累加容量,找到最小的 kk,使得:

k个考场容量之和m前k个考场容量之和 \ge m

此时使用了 kk 个考场。

由于每个考场需要 22 名监考员,所以答案为:

2×k2 \times k


做法

  • 初始化 sum=0sum = 0
  • 从第 1 个考场开始:
    • 累加容量
    • 如果 summsum \ge m,输出 2×i2 \times i 并结束

复杂度

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)

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

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    long long m;
    cin >> n >> m;

    long long sum = 0;
    for (int i = 1; i <= n; i++) {
        long long r, c;
        cin >> r >> c;
        sum += r * c;
        if (sum >= m) {
            cout << 2LL * i << '\n';
            return 0;
        }
    }

    return 0;
}

C.小智网校冒险记 🐶📚✨

思路

课程必须按顺序学习。

设当前时间为 curcur(上一门课的结束时间),初始为 1-1

对于每一门课程:

  • 在所有班级 (s,t)(s, t)
  • 找到满足 s>curs > cur 的班级
  • 选择其中 结束时间 tt 最小

这样可以尽量早结束当前课程,给后面的课程留更多时间(贪心)


做法

  • 初始化 cur=1cur = -1
  • 遍历每一门课:
    • 枚举所有班级
    • 找满足 s>curs > cur 的最小 tt
    • 若不存在,输出 1-1
    • 否则更新 cur=tcur = t
  • 最后判断:
    • curmcur \le m 输出 curcur
    • 否则输出 1-1

复杂度

  • 时间复杂度:O(ci)O(\sum c_i)
  • 空间复杂度:O(1)O(1)

代码(带注释)

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

int main(){
    int n, m;
    cin >> n >> m;

    int cur = -1;  // 当前结束时间

    for(int i = 1; i <= n; i++){
        int c;
        cin >> c;

        int mn = 1e9 + 10;  // 当前课程的最优结束时间

        for(int j = 1; j <= c; j++){
            int s, t;
            cin >> s >> t;

            // 必须满足 s > cur
            if(s > cur){
                mn = min(mn, t);
            }
        }

        // 没有可选班级
        if(mn == 1e9 + 10){
            cout << -1;
            return 0;
        }

        // 更新当前时间
        cur = mn;
    }

    // 判断是否在 m 天内完成
    if(cur <= m) cout << cur;
    else cout << -1;

    return 0;
}

D.智程星题库小管家 📚✨

思路

用一个数组 a[i]a[i] 表示:题目 ii 当前属于哪个题库

初始时:

  • 所有题目都在题库 00
  • a[i]=0a[i] = 0

操作 1(移动)

把题目 uu 移到题库 vv

👉 直接赋值: a[u]=va[u] = v


操作 2(查询)

查询题库 vv 中第 uu 小的题目编号:

👉 做法:

  • 11mm 扫一遍
  • 找所有满足 a[j]=va[j] = v 的题目
  • 计数到第 uu 个时输出编号

如果不够 uu 个,则输出 1-1


复杂度

  • 每次查询最多扫描 mm
  • 总复杂度:O(k×m)O(k \times m)
  • 在数据范围内可以通过

代码(带注释)

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

int a[5010];  // a[i] 表示题目 i 所在的题库

int main(){
    int n, m, k;
    cin >> n >> m >> k;

    // 初始所有题目在题库 0(数组默认就是 0)

    for(int i = 1; i <= k; i++){
        int op;
        cin >> op;

        if(op == 1){
            // 操作1:移动题目
            int u, v;
            cin >> u >> v;

            a[u] = v;  // 直接修改所属题库

        }else{
            // 操作2:查询
            int u, v;
            cin >> u >> v;

            int cnt = 0;  // 当前题库中找到的题目数量

            for(int j = 1; j <= m; j++){
                if(a[j] == v){  // 属于题库 v
                    cnt++;
                    if(cnt == u){
                        cout << j << endl;  // 找到第 u 小
                        break;
                    }
                }
            }

            // 如果不足 u 个
            if(cnt < u){
                cout << -1 << endl;
            }
        }
    }

    return 0;
}

0 条评论

目前还没有评论...