从题意可知就是一种操作,选择字符个数为奇数个的一串,然后翻转,可以反转无数次求解最终字典序最小的字符串,因此可知下标奇数和下标偶数的字符要分别考虑,只需要把下标奇数的1从后往前放,下标偶数的1从后往前放即得到答案
AC代码:
#include <bits/stdc++.h> #define rep(i,a,n) for(int i=a;i<n;i++) using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; rep (oo, 0, T) { string s; cin >> s; int len = s.size(); s = '(' + s; int l = 0, r = 0; for (int i = 1; i <= len; i++) { if (s[i] == '1') { if (i & 1) { l++; } else { r++; } } s[i] = '0'; } if (len & 1) { for (int i = len; i >= 1; i -= 2) { if (l) { s[i] = '1'; l--; } else { break; } } for (int i = len - 1; i >= 1; i -= 2) { if (r) { s[i] = '1'; r--; } else { break; } } } else { for (int i = len; i >= 1; i -= 2) { if (r) { s[i] = '1'; r--; } else { break; } } for (int i = len - 1; i >= 1; i -= 2) { if (l) { s[i] = '1'; l--; } else { break; } } } for (int i = 1; i <= len; i++) { cout << s[i]; } cout << '\n'; } return 0; }
在一个二维平面用直线,不经过(0,0)把所有点连在一起,求最少多少条直线
AC代码:
#include <bits/stdc++.h> #define rep(i,a,n) for(int i=a;i<n;i++) using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; rep (oo, 0, T) { int n; cin >> n; cout << 2 * n << '\n'; } return 0; }
切割给定长宽的矩形,要求尽可能画最多的射线把矩形切割成每块面积不小于k的小矩形
AC代码:
#include <bits/stdc++.h> #define rep(i,a,n) for(int i=a;i<n;i++) using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; rep (oo, 0, T) { int n, m, k; cin >> n >> m >> k; if (n < m) { swap(n, m); } int x, y, z, ans; for (int i = 1; i <= n; i++) { if (i * m > k or i * m == k) { x = i; break; } } ans = n / x - 1 + x * m / k - 1; for (int i = 1; i <= m; i++) { if (i * n > k or i * n == k) { y = i; break; } } cout << max(n / x - 1 + x * m / k - 1, m / y - 1 + y * n / k - 1) << '\n'; } return 0; }
2022“杭电杯”中国大学生算法设计超级联赛(8)A、D、K
于 2022-08-12 15:24:22 首次发布