Codeforces Round 913 (Div. 3)
Codeforces Round 913 (Div. 3)
A:ABC
A. Rook
简单题,就两个循环搞定(直接上码)
#include <bits/stdc++.h>
using namespace std;
void solve() {
char a;
int b;
cin >> a >> b;
for (int i = 1; i <= 8; i++) {
if (i != b) {
cout << a << i << endl;
}
}
for (int i = 0; i < 8; i++) {
char x = 'a' + i;
if (x != a) {
cout << x << b << endl;
}
}
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
B. YetnotherrokenKeoard
题意:遇到'B'右边第一个大写字母删除,遇到'b'右边第一个小写字母删除
思路:从后往前遍历,然后记录bB的数量
最开始想太多直接从前面遍历然后就T了,后面一想发现自己好傻
#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e6 + 10;
char a[MAX];
void solve() {
string st;
cin >> st;
int x1 = 0, x2 = 0;
int l = 0;
for (int i = st.size() - 1; i >= 0; i--) {
if (st[i] == 'b') {
x1++;
} else if (st[i] == 'B') {
x2++;
} else if (st[i] >= 'a' && st[i] <= 'z' && x1) {
x1--;
} else if (st[i] >= 'A' && st[i] <= 'Z' && x2) {
x2--;
} else {
a[l] = st[i];
l++;
}
}
for (int i = l - 1; i >= 0; i--) {
cout << a[i];
}
cout << "\n";
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
C. Removal of Unattractive Pairs
题意:删除两个相同的字符,使得字符串长度最短
思路:统计最多的字符的数量
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a[26];
void solve() {
memset(a, 0, sizeof a);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
char x;
cin >> x;
a[x - 'a']++;
}
int ma = 0;
for (int i = 0; i < 26; i++) {
ma = max(a[i], ma);
}
//cout<<"ma:"<<ma<<"\n";
if (ma * 2 >= n) {
cout << ma * 2 - n << "\n";
} else {
if (n % 2) {
cout << "1\n";
} else cout << "0\n";
/*
int res = 0;
sort(a, a + 26);
for (int i = 25; i >= 0; i--) {
cout << "res:" << res << "\n";
}
cout << abs(res) << endl;
*/
}
}
signed main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
D. Jumping Through Segments
题意:给定n个区间,每次跳到一个区间求跳跃距离的最小值
思路:最大值的最小,所以:二分!!!
(都是给n个区间,直接想成acvv上的板子题了,于是sort一下就出来了,然后样例给了我狠狠一击)
#include <bits/stdc++.h>
using namespace std;
const int MAX = 2e5 + 10;
int l[MAX], r[MAX];
int n;
bool check(int k) {
int lx = 0, rx = 0;
for (int i = 1; i <= n; i++) {
int l1 = lx - k, r1 = rx + k;
if (l1 > r[i] || r1 < l[i]) {
return false;
}
lx = max(l1, l[i]);
rx = min(r[i], r1);
}
return true;
}
void solve() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> l[i] >> r[i];
}
int L = 0, R = 1e10;
while (L <= R) {
int m = (L + R) >> 1;
if (check(m)) R = m - 1;
else L = m + 1;
}
cout << R + 1 << endl;
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
E. Good Triples
题意:有一个三元组让
$$
digsum(a)+digsum(b)+digsum(c)=digsum(n)
$$
$$
a+b+c=n
$$
思路:可以从每一个数位上下手至于证明这东西我证不出来于是直接贴一个知乎上大佬的证明算了
证明:
假设求和时向高一位借数了,比如借了一个数。
如果高一位>=1,不会向高二位借数,相对于不借数的情况,左边的dig+10,右边的dig+1,这样在这一位左边的显然增加了9,高一位考虑答案时和当前位一样,左右的dig差值只会更大。举个例子,9+1+2=12
如果高二位==0,向高二位借数,这里假设能借到数,相对于不借数的情况,左边当前位dig+10,高一位dig+9,右边dig+1,右边高位如果借不到数还要增加dig,左右dig差值至少增加了18。举个例子,2+99+1=102
借两个数也是一样,也就是说只要借数了必然会导致dig的增加
考虑单独一位,只有不借数左右两边的dig才能相等!
#include <bits/stdc++.h>
using namespace std;
#define int long long
int cnt[20];
void solve() {
string n;
cin >> n;
int res = 1;
for (int i = 0; i < n.size(); i++) {
res *= cnt[n[i] - '0'];
}
cout << res << endl;
}
void init() {
for (int i = 0; i <= 9; i++) {
for (int j = 0; j + i <= 9; j++) {
for (int k = 0; i + j + k <= 9; k++) {
cnt[i + k + j]++;
}
}
}
}
signed main() {
int t;
cin >> t;
init();
while (t--) {
solve();
}
}
分类:
codeforces
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现