2025CSP-S模拟赛36 比赛总结

2025CSP-S模拟赛36

T1 T2 T3 T4
40 TLE 10 WA 20 TLE 37 WA

19/23。

不想说啥了,屁都不会。

反正挺神秘的。思路都不难,但是考场上就是想不到。。qwq

T1 购买饮料

比较神秘,脑子不好。

#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;
int n, x, a, b;
int solve() {
	n = read(), x = read(), a = read(), b = read();
	if (b >= a * x) {
		if (n / x >= a) printf("-1\n");
		else printf("%lld\n", n / x);
		return 0;
	}
	if (n < a * x) {
		printf("%lld\n", n / x);
		return 0;
	}
	int k = (n - a * x) / (a * x - b) + 1;
	int ans = k * a + (n + k * b - k * a * x) / x;
	printf("%lld\n", ans);
	
	return 0;
}
signed main() {
	freopen("buy.in", "r", stdin);
	freopen("buy.out", "w", stdout);
	int qq = read();
	while (qq--) {
		solve();
	}
	
	return 0;
}

T2 多边形

如果存在一个颜色只出现了一次,那么直接把这个点和所有其他点相连即可。否则一定会出现相邻的三个点颜色两两不同,直接把这三个点搞成一个三角形,然后删掉中间那个点重复以上过程即可。

#include <bits/stdc++.h>
#define il inline

using namespace std;

const int N = 1e6 + 10;
int n;
char s[N];
il bool check(int i, int j, int k) {
	return 
	(s[i] == 'R' && s[j] == 'B' && s[k] == 'G') || 
	(s[i] == 'R' && s[j] == 'G' && s[k] == 'B') || 
	(s[i] == 'B' && s[j] == 'R' && s[k] == 'G') || 
	(s[i] == 'B' && s[j] == 'G' && s[k] == 'R') || 
	(s[i] == 'G' && s[j] == 'B' && s[k] == 'R') || 
	(s[i] == 'G' && s[j] == 'R' && s[k] == 'B');
}
int nxt[N], pre[N]; 
set<int> st, s1, s2, s3;
il void add(int x, int y) {
	cout << x << " " << y << "\n";
}
int main() {
	freopen("polygon.in", "r", stdin);
	freopen("polygon.out", "w", stdout);
	ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
	cin >> n >> (s + 1);
	for (int i = 1; i <= n; i++) nxt[i] = i + 1, pre[i] = i - 1;
	nxt[n] = 1, pre[1] = n;
	for (int i = 1; i <= n; i++) {
		if (check(pre[i], i, nxt[i])) st.insert(i);
		if (s[i] == 'R') s1.insert(i);
		if (s[i] == 'B') s2.insert(i);
		if (s[i] == 'G') s3.insert(i);
	}
	while (s1.size() + s2.size() + s3.size() > 3) {
		if (s1.size() == 1) {
			int x = *s1.begin();
			for (int i = nxt[nxt[x]]; nxt[i] != x; i = nxt[i]) add(x, i);
			break;
		}
		if (s2.size() == 1) {
			int x = *s2.begin();
			for (int i = nxt[nxt[x]]; nxt[i] != x; i = nxt[i]) add(x, i);
			break;
		}
		if (s3.size() == 1) {
			int x = *s3.begin();
			for (int i = nxt[nxt[x]]; nxt[i] != x; i = nxt[i]) add(x, i);
			break;
		}
		int x = *st.begin();
		st.erase(x);
		if (s[x] == 'R') s1.erase(x);
		if (s[x] == 'B') s2.erase(x);
		if (s[x] == 'G') s3.erase(x);
		add(pre[x], nxt[x]);
		int i = pre[x], j = nxt[x];
		st.erase(i), st.erase(j);
		nxt[i] = j, pre[j] = i;
		if (check(pre[i], i, nxt[i])) st.insert(i);
		if (check(pre[j], j, nxt[j])) st.insert(j);
	}
	
	return 0;
}

T3 二分图最大权匹配

T4 飞毯

posted @ 2025-08-18 14:10  Zctf1088  阅读(27)  评论(0)    收藏  举报