博客
关于我
Codeforces Round #706 (Div. 2)
阅读量:150 次
发布时间:2019-02-27

本文共 3025 字,大约阅读时间需要 10 分钟。

A. Split It!

题意:判断一个字符串是否能满足以下条件:

s = a₁ + a₂ + … + a_k + a_k+1 + R(a_k) + R(a_k-1) + … + R(a₁),并且R(a b c d) = d c b a。

解法

只需从两端开始比较,中间的字符作为a(k+1)。只要两端相同字符的个数≥k即可。

代码解析

#include 
using namespace std; int main() { int t, i, j, n, k; string s1; cin >> t; while (t--) { cin >> n >> k >> s1; if (k == 0) { cout << "YES" << endl; continue; } if (k + k + 1 > n) { cout << "NO" << endl; continue; } int cnt = 0; for (int i = 0; i < s1.length() / 2; ++i) { if (s1[i] == s1[s1.length() - 1 - i]) { cnt++; if (cnt == k) { cout << "YES" << endl; break; } } } if (cnt < k) { cout << "NO" << endl; } } }

B. Max and Mex

题意:进行k次操作,每次操作将从数组中找出最大的数(max)和最小的未出现的数(mex),然后将它们相加并除以2,判断新值是否存在。如果存在,则操作可以继续,否则操作结束。

解法

每次操作需要计算当前数组的max和mex,然后判断(max + mex) / 2是否已经存在。如果是,则操作次数减少1,否则继续操作。

代码解析

#include 
using namespace std; const int maxn = 1e5 + 1000; int a[maxn]; int main() { int t, i, j, n, k; map
mo; cin >> t; while (t--) { cin >> n >> k; for (int i = 0; i < n; ++i) { cin >> a[i]; mo[a[i]] = 1; } sort(a, a + n); int d1 = 0, max1 = a[n - 1]; for (int i = 0; i < n; ++i) { if (d1 == max1 + 1) { d1++; continue; } else { break; } } int m1 = (max1 + d1) % 2 == 0 ? (max1 + d1) / 2 : (max1 + d1) / 2 + 1; if (mo[m1] == 0 && k >= 1) { cout << n + 1 << endl; k--; } else { cout << n << endl; } } }

C. Diamond Miner

题意:给定x轴和y轴上的n个点,求两两相连所构成的三角形的斜边和最小值。

解法

对x轴和y轴的点分别排序,然后计算每个点与其他点的距离,取最小值即可。

代码解析

#include 
using namespace std; const int maxn = 1e5 + 1000; double x[maxn], y[maxn]; bool cmp(double x1, double y1) { return x1 > y1; } int main() { int t, i, j, n; scanf("%d", &t); while (t--) { scanf("%d", &n); int cnt1 = 0, cnt2 = 0; for (int i = 0; i < 2 * n; ++i) { int x1, y1; scanf("%d%d", &x1, &y1); if (x1 == 0) y[cnt1++] = abs(y1); if (y1 == 0) x[cnt2++] = abs(x1); } sort(y, y + n); sort(x, x + n); int zs1 = 0, zs2 = n - 1, ys1 = 0, ys2 = n - 1; double min_length = 1e18; for (int i = 0; i < n; ++i) { double x1 = x[i], y1 = y[i]; double len1 = sqrt((x1 - x[zs2]) * (x1 - x[zs2]) + (y1 - y[zs2]) * (y1 - y[zs2])); double len2 = sqrt((x1 - x[ys2]) * (x1 - x[ys2]) + (y1 - y[ys2]) * (y1 - y[ys2])); min_length = min(min_length, len1, len2); } cout << min_length << endl; } }

转载地址:http://elbd.baihongyu.com/

你可能感兴趣的文章
Objective-C实现Dinic算法(附完整源码)
查看>>
Objective-C实现disjoint set不相交集算法(附完整源码)
查看>>
Objective-C实现DisjointSet并查集的算法(附完整源码)
查看>>
Objective-C实现djb2哈希算法(附完整源码)
查看>>
Objective-C实现DNF排序算法(附完整源码)
查看>>
Objective-C实现double factorial iterative双阶乘迭代算法(附完整源码)
查看>>
Objective-C实现double factorial recursive双阶乘递归算法(附完整源码)
查看>>
Objective-C实现double hash双哈希算法(附完整源码)
查看>>
Objective-C实现double linear search recursion双线性搜索递归算法(附完整源码)
查看>>
Objective-C实现DoublyLinkedList双链表的算法(附完整源码)
查看>>
Objective-C实现DPLL(davisb putnamb logemannb loveland)算法(附完整源码)
查看>>
Objective-C实现Edmonds-Karp算法(附完整源码)
查看>>
Objective-C实现EEMD算法(附完整源码)
查看>>
Objective-C实现EM算法(附完整源码)
查看>>
Objective-C实现EM算法(附完整源码)
查看>>
Objective-C实现entropy熵算法(附完整源码)
查看>>
Objective-C实现euclidean distance欧式距离算法(附完整源码)
查看>>
Objective-C实现Euclidean GCD欧几里得最大公约数算法(附完整源码)
查看>>
Objective-C实现euclideanDistance欧氏距离算法(附完整源码)
查看>>
Objective-C实现euler method欧拉法算法(附完整源码)
查看>>