- 月赛
【ZCX-002-DIV3】智程星周赛002(入门组)题解
- @ 2026-3-31 17:36:11
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 个考场开始,连续使用考场。
每个考场的容量为:
我们从前往后累加容量,找到最小的 ,使得:
此时使用了 个考场。
由于每个考场需要 名监考员,所以答案为:
做法
- 初始化
- 从第 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.小智网校冒险记 🐶📚✨
思路
课程必须按顺序学习。
设当前时间为 (上一门课的结束时间),初始为 。
对于每一门课程:
- 在所有班级 中
- 找到满足 的班级
- 选择其中 结束时间 最小 的
这样可以尽量早结束当前课程,给后面的课程留更多时间(贪心)
做法
- 初始化
- 遍历每一门课:
- 枚举所有班级
- 找满足 的最小
- 若不存在,输出
- 否则更新
- 最后判断:
- 若 输出
- 否则输出
复杂度
- 时间复杂度:
- 空间复杂度:
代码(带注释)
#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.智程星题库小管家 📚✨
思路
用一个数组 表示:题目 当前属于哪个题库
初始时:
- 所有题目都在题库
- 即
操作 1(移动)
把题目 移到题库
👉 直接赋值:
操作 2(查询)
查询题库 中第 小的题目编号:
👉 做法:
- 从 到 扫一遍
- 找所有满足 的题目
- 计数到第 个时输出编号
如果不够 个,则输出
复杂度
- 每次查询最多扫描
- 总复杂度:
- 在数据范围内可以通过
代码(带注释)
#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 条评论
目前还没有评论...