arc123 C、D 题解(haven't finish.
link
感悟:其实,一道题不妨从样例入手。
C
考场上 dfs “水过去” 的(感觉可以剪掉很多枝,常数
至于证明,现在不想理解,以后来填吧。
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define LL long long
using namespace std;
int T, ans, maxx, i, g;
LL n, t, f, no;
bool dfs(LL t, int nyhsb, int limit_, int las) {
// printf("|%lld %d %d %d|\n", t, nyhsb, limit_, las);
if(t == 0) return (!nyhsb);
int g = t % 10, flag = 0; g -= nyhsb;
if(g == -1) g = 9, flag = 1;
if((int)ceil(g / 3.0) <= las) {
if(las == 0x3f3f3f3f && dfs(t / 10, flag, 1, min(las, g))) return 1;
if(las != 0x3f3f3f3f && dfs(t / 10, flag, 1, min(las, g))) return 1;
}
// if(g + 10 <= i * 3) {
// printf("rnm:%d %d %d\n", t, (int)ceil((g + 10) / 3.0), g);
if((int)ceil((g + 10) / 3.0) > las) return 0;
if(las == 0x3f3f3f3f && dfs(t / 10, 1, 1, min(las, g + 10))) return 1;
if(las != 0x3f3f3f3f && dfs(t / 10, 1, 1, min(las, g + 10))) return 1;
// }
return 0;
}
int main() {
scanf("%d", &T); ans = 0;
while(T --) {
scanf("%lld", &n); ans = 0;
for(i = 1; ; i ++) {
t = n;
// if(i <= 3) {
// no = 0; t = n; maxx = 0; f = 0;
// while(t) {
// // printf("|%d %lld %d|\n", i, t, f);
// g = t % 10; t /= 10;
// if(g > i * 3) { no = 1; break; }
// else if((int)ceil(g / 3.0) == i) f = 1;
// else if(!f) { no = 1; break; }
// }
// if(no) continue; ans = i; break;
// }
if(dfs(t, 0, 0, i)) { ans = i; break; }
// if(i > 100) { printf("NYH yydsb!"); break; }
}
printf("%d\n", ans);
}
return 0;
}
/*
2
40
9025745
*/
D
因为考场上将
由题意得
1.
2.
然后就结了。
这里有一个 trick,用类似快排的东西找第
暴力跑:
```cpp
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#define LL long long
using namespace std;
const int MAXN = 4e5 + 5;
int n, a[MAXN];
LL ans, c[MAXN];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
for(int i = 1; i <= n; i ++) {
if(a[i] >= a[i - 1]) c[i] = c[i - 1] + a[i] - a[i - 1];
else c[i] = c[i - 1];
}
for(int i = n + 1; i <= 2 * n; i ++) c[i] = a[i - n] - c[i - n];
for(int i = 1; i <= n; i ++) c[i] = -c[i];
sort(c + 1, c + 1 + 2 * n);
for(int i = 1; i <= 2 * n; i ++) ans += abs(c[i] - c[n]); printf("%lld", ans);
return 0;
}
</details>
分类:
Ex-其他 / 模拟赛/比赛
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】