2025CSP-S模拟赛25 比赛总结
2025CSP-S模拟赛25
| T1 | T2 | T3 | T4 |
|---|---|---|---|
| 100 AC | 100 AC | 20 TLE | 10 PE |
排名:4/23;总分:230
比较有实力。T1 构造直接切,T2 dfs + 剪枝跑过了,T3 T4 均为部分分。
这场人均 200+,比较简单,没挂分。
一句话:花卉市场送福利。
T1 花昌蒲
观察大样例找规律,是简单的构造。
#include <bits/stdc++.h>
using namespace std;
int n, m;
pair<int, int> ans[10000];
int tot;
int main() {
scanf("%d%d", &n, &m);
if (m == 0) {
if (n == 3) {
printf("0\n");
return 0;
}
printf("%d\n", n + 1);
for (int i = 1; i <= n; i++) {
printf("%d %d\n", i, n + 1);
}
return 0;
}
if (n - m < 2) {
printf("0\n");
return 0;
}
int cnt1 = m + 2, cnt2 = m;
int id = 1;
for (int i = 1; i < m; i++) {
ans[++tot] = {id, id + 1};
id++;
}
for (int i = 1; i <= m; i++) {
ans[++tot] = {i, id + 1};
id++;
}
ans[++tot] = {1, ++id};
ans[++tot] = {m, ++id};
if (cnt1 == n && cnt2 == m) {
printf("%d\n", tot + 1);
for (int i = 1; i <= tot; i++) {
printf("%d %d\n", ans[i].first, ans[i].second);
}
return 0;
}
if (n - cnt1 == 1) {
printf("0\n");
return 0;
}
int lst = id;
for (int i = 1; i <= n - cnt1 + 1; i++) {
ans[++tot] = {lst, ++id};
}
printf("%d\n", tot + 1);
for (int i = 1; i <= tot; i++) {
printf("%d %d\n", ans[i].first, ans[i].second);
}
return 0;
}
T2 百日草
dfs + 剪枝直接跑过,这就是大常数选手的蜕变。
#include <bits/stdc++.h>
#define il inline
#define int long long
using namespace std;
const int bufsz = 1 << 20;
char ibuf[bufsz], *p1 = ibuf, *p2 = ibuf;
#define getchar() (p1 == p2 && (p2 = (p1 = ibuf) + fread(ibuf, 1, bufsz, stdin), p1 == p2) ? EOF : *p1++)
il int read() {
int x = 0; char ch = getchar(); bool t = 0;
while (ch < '0' || ch > '9') {t ^= ch == '-'; ch = getchar();}
while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
return t ? -x : x;
}
const int INF = 0x3f3f3f3f3f3f3f3f;
const int N = 3e5 + 10;
int n, m;
struct edge {
int y, w;
};
vector<edge> G[N];
int f[N];
int ans;
il void dfs(int x, int t, int v) {
if (v >= ans || v >= f[x] || t >= n) return;
if (x == n) {
ans = min(ans, v);
return;
}
f[x] = v;
for (edge i : G[x]) {
dfs(i.y, t + 1, max(v, i.w * (t + 1)));
}
}
signed main() {
n = read(), m = read();
for (int i = 1; i <= m; i++) {
int x = read(), y = read(), w = read();
G[x].push_back({y, w});
}
for (int i = 1; i <= n; i++) f[i] = INF;
ans = INF;
dfs(1, 0, 0);
printf("%lld\n", ans);
return 0;
}

浙公网安备 33010602011771号