20230924 模拟赛总结
模拟赛链接
排名:
分数:
集训期间第一次 AK!
T1:零用钱 / money
题目描述:
共 Deficit
。(
思路:
考虑每一个长度为
(以上
由于我们需要让总元素和最大,所以我们需要在满足以上条件的情况下让
时间复杂度:
代码:
#include <bits/stdc++.h>
using namespace std;
const int kMaxN = 10005;
int T, n, k, s, d, x, y, p, q, a[kMaxN], ans;
int main() {
freopen("money.in", "r", stdin);
freopen("money.out", "w", stdout);
for (cin >> T; T; T--) {
cin >> n >> k >> s >> d;
for (int i = 0; i <= k; i++) {
if (i * s - (k - i) * d >= 0) {
x = i - 1, y = k - i + 1;
break;
}
}
p = n / k, q = n % k;
ans = s * x * p - d * y * p + min(q, x) * s - (q - min(q, x)) * d;
if (ans >= 0) {
cout << ans << '\n';
} else {
cout << "Deficit\n";
}
}
return 0;
}
T2:矩形求和 / matrix
题目描述:
给定一个
思路:
这题一眼二位前缀和,不再赘述。
时间复杂度:
代码:
#include <bits/stdc++.h>
using namespace std;
const int kMaxN = 1005;
int n, m, r, c, a[kMaxN][kMaxN], sum[kMaxN][kMaxN], ans;
int main() {
freopen("matrix.in", "r", stdin);
freopen("matrix.out", "w", stdout);
ios::sync_with_stdio(0), cin.tie(0);
cin >> n >> m >> r >> c;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> a[i][j];
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + a[i][j];
}
}
for (int i = 1; i + r - 1 <= n; i++) {
for (int j = 1; j + c - 1 <= m; j++) {
ans = max(ans, sum[i + r - 1][j + c - 1] - sum[i - 1][j + c - 1] - sum[i + r - 1][j - 1] + sum[i - 1][j - 1]);
}
}
cout << ans;
return 0;
}
T3:射击 / dart
题目描述:
射击规则如下:最多射击
思路:
经过一顿胡乱的做法,发现 dp 是不行滴,发现
很容易想到先枚举前两个分值,知道前两个分值后该怎么办呢?从题目得知,若前两个选的物品的总和为
时间复杂度:
代码:
#include <bits/stdc++.h>
using namespace std;
const int kMaxN = 1005;
int n, m, a[kMaxN], b[kMaxN * kMaxN], tot, ans;
int main() {
freopen("dart.in", "r", stdin);
freopen("dart.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= n; j++) {
b[++tot] = a[i] + a[j];
}
}
sort(b + 1, b + 1 + tot);
for (int i = 1, p; i <= tot; i++) {
if (b[i] > m) {
break;
}
p = upper_bound(b + 1, b + 1 + tot, m - b[i]) - b - 1;
b[i] + b[p] <= m && (ans = max(ans, b[i] + b[p]));
}
cout << ans;
return 0;
}
T4:序列合并 / sequence
题目描述:
洛谷原题:Luogu-P1631
有两个长度为
思路:
这题是一道很板子的题目,首先将 std::set
去重。
时间复杂度:
代码:
#include <bits/stdc++.h>
using namespace std;
const int kMaxN = 1e5 + 5;
int n, a[kMaxN], b[kMaxN];
struct P {
int i, j;
bool operator<(const P &y) const {
return a[i] + b[j] > a[y.i] + b[y.j];
}
} now;
priority_queue<P> q;
set<pair<int, int>> s;
int main() {
freopen("sequence.in", "r", stdin);
freopen("sequence.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= n; i++) {
cin >> b[i];
}
sort(a + 1, a + 1 + n);
sort(b + 1, b + 1 + n);
q.push({1, 1});
for (int i = 1; i <= n;) {
q.pop();
if (s.count({q.top().i, q.top().j})) {
continue;
}
now = q.top();
s.insert({now.i, now.j});
cout << a[now.i] + b[now.j] << ' ';
q.push({now.i + 1, now.j});
q.push({now.i, now.j + 1}), i++;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】