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

浙公网安备 33010602011771号