CF Round #829 题解 (Div. 2)
F 没看所以摆了 .
看拜月教教主 LHQ 在群里代打恰钱 /bx
目录
A. Technical Support (*800)
SoyTony 强啊 .
维护一个计数器,扫一遍遇到 加一,遇到 减一,每次要小于 0 了就赋成 0,看一下最后计数器是否等于 0 即可 .
正确性显然 .
B. Kevin and Permutation (*800)
构造比较显然,不太好说,直接放代码 .
int main()
{
int T, n; scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
for (int i=n; i>=1; i--)
{
if (i & 1 ^ 1) printf("%d ", 1+(i-1)/2);
else printf("%d ", 1+i/2+n/2);
}
puts("");
}
return 0;
}
C. Make Nonzero Sum (C1 *1300, C2 *1500)
C1, C2 是一样的 .
首先任何一种拆分方案都可以化成等价的只用长度为 1 和 2 的区间的方案 .
就是对于偶数,两两分,对于奇数再分一个 1 出来即可 .
这样就证明了用 1, 2 构造方案如果构不出来一定无解 .
然后先求一下序列之和然后贪心地选一些不相邻的幸运元素乘上 即可完成构造 .
听 SoyTony 说似乎比较难写?那我放下代码 .
const int N = 222222;
int n, a[N];
int main()
{
int T; scanf("%d", &T);
while (T--)
{
scanf("%d", &n); int s = 0;
for (int i=1; i<=n; i++) scanf("%d", a+i), s += a[i];
int k=0;
string ans;
char tmp[114514];
for (int i=1; i<=n; i++)
{
if ((s * a[i+1] > 0) && (i != n)){sprintf(tmp, "%d %d\n", i, i+1); ++k; ++i; s -= 2 * a[i];}
else{sprintf(tmp, "%d %d\n", i, i); ++k;}
ans += tmp;
}
if (s){puts("-1"); continue;}
else printf("%d\n%s", k, ans.c_str());
}
return 0;
}
D. Factorial Divisibility (*1600)
感性理解一下,直接暴力合并判断 .
具体的,
const int N = 522222;
int n, k, a[N], z[N];
int main()
{
scanf("%d%d", &n, &k);
for (int i=1; i<=n; i++) ++z[read<int>()];
for (int i=1; i<k; i++)
{
z[i+1] += z[i] / (i+1);
if (z[i] % (i+1)){puts("No"); return 0;}
}
puts("Yes");
return 0;
}
E. Wish I Knew How to Sort (*2000)
令序列中有 个 ,目前前 个数有 个 ,然后要排序就需要 次有效交换 .
减少一个 的概率是
令 还剩 次有效交换的的期望,则
移项,经过化简可以得到答案是 .
暴力算一下就是 的 .
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16830167.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】