
Codeforces Global Round 12(个人题解)
发布日期:2021-05-09 00:12:35
浏览次数:17
分类:博客文章
本文共 3716 字,大约阅读时间需要 12 分钟。
1450A. Avoid Trygub
挺简单的题,题意是避免字符串中有子串“Trygub"
只要给字符串排序就可以了,这样一定不会出现
void solve() { string s; int n; cin >> n >> s; sort(s.begin(), s.end()); cout << s << endl;}
1450B. Balls of Steel
想太多了,因为数据范围比较小,可以直接暴力比较一下就ok
void solve() { int n, k; cin >> n >> k; int x[n], y[n]; for (int i = 0; i < n; ++i) cin >> x[i] >> y[i]; bool fl = true; for (int i = 0; i < n && fl; i++) { fl = 0; for (int j = 0; j < n; j++) if (abs(x[i] - x[j]) + abs(y[i] - y[j]) > k) fl = 1; } cout << (fl ? -1 : 1) << endl;}
1450C1&C2. Errich-Tac-Toe (Hard Version)
刚开始看的时候有点懵,看了一下的解释明白了。
考虑(i + j) % 3, 记 ++cnt[(i + j) % 3][s[i][j] == 'X']
最后无非选择 i, j(-1<i,j<3, i!=j) 使得 s[i][1] + s[j][0] <= k/3, 即使得每3个相邻的标记中存在两个不同的标记
一定存在这样的 i, j使得 <= k/3, 自己画个表就明白了
int _, n, m, s[2][5];char a[305][305];void solve() { int i, j, k, t; scanf("%d", &n); m = 0; memset(s, 0, sizeof(s)); for (i = 0; i < n; i++) { scanf("%s", a[i]); for (j = 0; j < n; j++) if (a[i][j] != '.') m++, s[a[i][j] == 'X'][(i + j) % 3]++; } for (k = 0; k < 3; k++) for (t = 0; t < 3; t++) if (k ^ t && s[1][k] + s[0][t] <= m / 3) { for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (a[i][j] != '.') if ((i + j) % 3 == k) a[i][j] = 'O'; else if ((i + j) % 3 == t) a[i][j] = 'X'; m = -3; } for (i = 0; i < n; i++) printf("%s\n", a[i]);}
1450D. Rating Compression
根据题意模拟一下,各个用户满意情况
const int N = 3e5 + 10;char s[N];vector v[N];void solve() { int n, a, i, j; i = 0; // 把各位数字的出现次数标记 for (cin >> n; i != n; s[i++] = '0', cin >> a, v[a].push_back(i)) ; // 模拟条件 for (a = j = 1; v[a].size() == 1 && (j == v[a][0] || v[a][0] == i); s[n - a] = '1', i == v[a++][0] ? --i : ++j) ; for (v[a].empty() ? '0' : s[n - a] = '1'; a <= n && v[a].size() == 1; ++a) ; // 设置'\0',并且重置v数组 for (s[n] = 0, a == ++n ? s[0] = '1' : '0'; --n; v[n].clear()) ; cout << s << endl;}
1450E. Capitalism
建图跑个多源floyd最短路就好,
顺便记得判个负环
// Author : RioTian// Time : 20/12/21#includeusing namespace std;#define all(s) (s.being(), s.end())#define rep(i, s, n) for (int i = s; i <= n; ++i)typedef long long ll;int n, m, g[200][200];int a[2000], b[2000], c;int main(void) { memset(g, 0x3f, sizeof(g)); scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) { scanf("%d%d%d", &a[i], &b[i], &c); g[a[i] - 1][b[i] - 1] = 1; if (c == 1) g[b[i] - 1][a[i] - 1] = -1; else g[b[i] - 1][a[i] - 1] = 1; } for (int i = 0; i < n; i++) g[i][i] = 0; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) for (int k = 0; k < n; k++) g[j][k] = min(g[j][k], g[j][i] + g[i][k]); int pos = -1, ans = -1; for (int i = 0; i < n; i++) { if (g[i][i] < 0) { printf("NO\n"); return 0; } int mx = -n, mn = n; for (int j = 0; j < n; j++) { mx = max(mx, g[i][j]); mn = min(mn, g[i][j]); } for (int j = 0; j < m; j++) if (g[i][a[j] - 1] == g[i][b[j] - 1]) mx = -n; if (ans < mx - mn) { ans = mx - mn; pos = i; } } if (ans == -1) printf("NO\n"); else { printf("YES\n%d\n", ans); for (int i = 0; i < n; i++) printf("%d%c", g[pos][i] + n, i == n - 1 ? '\n' : ' '); } return 0;}
F、G、F1&F2没做出来了。等待以后重新补题
发表评论
最新留言
不错!
[***.144.177.141]2025年04月08日 18时41分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
1086 Tree Traversals Again
2019-03-06
1127 ZigZagging on a Tree
2019-03-06
1062 Talent and Virtue
2019-03-06
1045 Favorite Color Stripe
2019-03-06
B. Spreadsheets(进制转换,数学)
2019-03-06
等和的分隔子集(DP)
2019-03-06
基础练习 十六进制转八进制(模拟)
2019-03-06
L - Large Division (大数, 同余)
2019-03-06
39. Combination Sum
2019-03-06
41. First Missing Positive
2019-03-06
80. Remove Duplicates from Sorted Array II
2019-03-06
83. Remove Duplicates from Sorted List
2019-03-06
410. Split Array Largest Sum
2019-03-06
开源项目在闲鱼、b 站上被倒卖?这是什么骚操作?
2019-03-06
Vue3发布半年我不学,摸鱼爽歪歪,哎~就是玩儿
2019-03-06
《实战java高并发程序设计》源码整理及读书笔记
2019-03-06
Java开源博客My-Blog(SpringBoot+Docker)系列文章
2019-03-06
程序员视角:鹿晗公布恋情是如何把微博搞炸的?
2019-03-06
【JavaScript】动态原型模式创建对象 ||为何不能用字面量创建原型对象?
2019-03-06