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;
}

T3 紫丁香

T4 麒麟草

posted @ 2025-07-24 14:13  Zctf1088  阅读(66)  评论(0)    收藏  举报