AtCoder Beginner Contest 363 补题记录(A~F)
难度:A < B < C < E ≈ F << D
做题顺序:A -> B -> C -> F -> E -> D
其实 VP 的时候 perf 还是有
A
signed main() {
int n;
cin >> n;
int cnt = 0;
do {
++cnt;
++n;
} while (n % 100);
cout << cnt << '\n';
return 0;
}
B
问题即为:两个操作:整体加一,区间求
因为整体加一之后相对的大小关系不会变化所以直接从大到小排序,然后暴力看整体加多少次
时间复杂度为
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 500100;
int l[N];
signed main() {
int n, t, p;
cin >> n >> t >> p;
for (int i = 1; i <= n; ++i)
scanf("%lld", &l[i]);
sort(l + 1, l + n + 1, greater<>());
// 至少有 p 个人头发长度超过为 t
if (l[p] >= t) {
puts("0");
return 0;
}
for (int i = 1; ; ++i) {
for (int j = 1; j <= n; ++j)
++l[j];
if (l[p] >= t) {
printf("%lld\n", i);
return 0;
}
}
return 0;
}
C
直接枚举字符串
枚举字符串所有排列可以先给字符串排序,然后用 next_permutation
找下一个排列。
时间复杂度为
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 500100;
int l[N];
signed main() {
int n, k;
scanf("%lld%lld", &n, &k);
set<string> se;
string s;
cin >> s;
sort(s.begin(), s.end());
do {
int ok = 1;
for (int i = 0, j = k - 1; j < n; ++i, ++j) {
string tmp;
for (int p = i; p <= j; ++p)
tmp += s[p];
string we = tmp;
reverse(we.begin(), we.end());
if (we == tmp) {
ok = 0;
break;
}
}
if (ok) se.insert(s);
} while (next_permutation(s.begin(), s.end()));
cout << se.size() << '\n';
return 0;
}
D
其实不会做.jpg
有一个很好的搞这一类题的方法:首先打表找一下规律,可以发现,对于一个长度为
- 若
,则有 个长度为 的回文串。 - 否则,有
个长度为 的回文字符串。
然后就各种乱七八糟处理就行了。具体是怎么过的我也不知道。
大体上就是说,考虑每一位的贡献,枚举这个位置的答案
然后就是说这个东西细节特别多,就是看到哪里不太对劲就扯一下,凑过去就行。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int ans = 1;
int n, f[55];
signed main(){
scanf("%lld", &n);
if (n == 1) {
puts("0");
return 0;
}
--n;
f[1] = 9;
for (int i = 2; i <= 40; ++i){
if (i & 1)
f[i] = f[i - 1] * 10;
else
f[i] = f[i - 1];
}
int k;
for (k = 1; ; ++k) {
if (n > f[k])
n -= f[k];
else
break;
}
int wei = k + 1 >> 1;
for (int i = 1; i <= wei; ++i) {
int st = (i == 1) ? 1 : 0;
while (n > f[k] / 9) n -= f[k] / 9, ++st;
--k, --k;
if (i == 1) ans = st;
else ans = ans * 10 + st;
}
cout << ans;
if (k & 1)
ans /= 10;
while (ans) {
printf("%lld", ans % 10);
ans /= 10;
}
puts("");
return 0;
}
E
又回到了简单题。考虑枚举
然后考虑维护一下当前所有在边上的地段。对于每一个地段,若在
时间复杂度为
#include<bits/stdc++.h>
#define int long long
using namespace std;
int ans = 1;
int n, f[55];
signed main(){
scanf("%lld", &n);
if (n == 1) {
puts("0");
return 0;
}
--n;
f[1] = 9;
for (int i = 2; i <= 40; ++i){
if (i & 1)
f[i] = f[i - 1] * 10;
else
f[i] = f[i - 1];
}
int k;
for (k = 1; ; ++k) {
if (n > f[k])
n -= f[k];
else
break;
}
int wei = k + 1 >> 1;
for (int i = 1; i <= wei; ++i) {
int st = (i == 1) ? 1 : 0;
while (n > f[k] / 9) n -= f[k] / 9, ++st;
--k, --k;
if (i == 1) ans = st;
else ans = ans * 10 + st;
}
cout << ans;
if (k & 1)
ans /= 10;
while (ans) {
printf("%lld", ans % 10);
ans /= 10;
}
puts("");
return 0;
}
F
还是简单题。容易发现满足条件的字符串
中有偶数个元素。 中有奇数个元素。
其中偶数个元素的情况可以归结到奇数个元素的情况中。即在正中间的两个元素之间加一个数字
然后开始暴力搜索。枚举当前剩余的数
最后警示一下:有返回值的函数一定要返回。这个【】因为没有返回调试了 20+min
。
#pragma GCC optimize(3)
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 500100;
int l[N];
bool check(int n) {
string s = to_string(n);
string t = s;
reverse(t.begin(), t.end());
return s == t && !count(s.begin(), s.end(), '0');
}
int mysqrt(int x) {
int l = 0, r = x + 10, best = -1;
while (l <= r) {
int mid = l + r >> 1;
if ((__int128)(mid) * (__int128)(mid) <= x)
best = mid, l = mid + 1;
else
r = mid - 1;
}
return best;
}
vector<int> Div(int x) {
vector<int> v;
for (int i = 1; i * i <= x; ++i)
if (x % i == 0) {
if (i != 1)
v.emplace_back(i);
if (i * i != x && i != 1)
v.emplace_back(x / i);
}
sort(v.begin(), v.end());
return v;
}
void fun(int x, int you, string qian) {
// cout << "x = " << x << '\n';
if (check(x)) {
// cout << "x = " << x << '\n';
// cout << "qwq: " << qian << '\n';
// exit(0);
// cout << "dbg " << qian << ' ' << you << '\n';
cout << qian;
if (x) {
if (qian.size()) cout << "*";
cout << x;
if (qian.size()) cout << "*";
} else {
cout << "*";
}
reverse(qian.begin(), qian.end());
cout << qian << '\n';
exit(0);
}
vector<int> dx = Div(x);
// cout << "qwq: ";
// for (auto &x : dx) cout << x << ' ';
// cout << "All = " << x << '\n';
for (auto &d : dx) {
string sd = to_string(d);
reverse(sd.begin(), sd.end());
if (count(sd.begin(), sd.end(), '0')) continue;
int dd = 0;
for (auto &x : sd) dd = dd * 10 + x - '0';
// cout << "qwq " << d << ' ' << dd << '\n';
if ((x / d) % dd == 0) {
int val = x / d / dd;
string nw = qian;
if (nw.size()) nw += "*";
nw += to_string(d);
fun(val, you, nw);
}
}
}
signed main() {
int n;
scanf("%lld", &n);
if (check(n)) {
printf("%lld\n", n);
return 0;
}
vector<int> div = Div(n);
fun(n, 0, "");
// for (auto &d : div)
// if (check(d)) {
// int rem = n / d;
// fun(rem, d, "");
// }
cout << "-1\n";
return 0;
}
G
待补。
本文来自博客园,作者:yhbqwq,转载请注明原文链接:https://www.cnblogs.com/yhbqwq/p/18314564,谢谢QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效