Codeforces Round 887 (Div. 2)

Codeforces Round 887 (Div. 2)

A. Desorting

题目大意

给出一个长度为 n 的数组 a ,可以执行这个操作任意次。

选择一下标 i, 使得 a1...i 加上 1ai+1...n 减少 1

问最少几次操作使得数组 a 无序。

思路

首先如果 a 原本就无序的话是输出 0

如果有序我们不妨进行如下操作:

找出最小的相邻两数差,对于以上说的操作我们可以画图

我们找到最小极差,将蓝色的方格当成 i 进行 x2 次操作使得两个有颜色的方格持平,然后+1使得红色高度大于蓝色高度。

所以答案就是 min{aiai1}2+1

int ans = 1e9 + 7; for (int i = 1; i < n; i++) ans = min(ans, a[i] - a[i - 1]); cout << ans / 2 + 1 << endl;

B - Fibonaccharsis

题目大意

给两个正整数 n,k 问有多少个斐波那契数列的第 k 项为 n.

思路

斐波那契额最小是 0,1,1,2,3... 到第 28 项就超过 2e5 了,所以超过 28 直接输出 0

设第一位 x,第二位 y 接下来为

x+y,x+2y,2x+3y,3x+5y...

我们可以直接预处理出正常的斐波那契额数列 F

带进去可得第 kn=F[k2]x+F[k1]y

枚举其中的一个值 x, 如果 (nF[k2]x)modF[k1]=0 那么答案加一

int ans = 0; f[1] = f[2] = 1; for (int i = 3; i <= 30; i++) f[i] = f[i - 1] + f[i - 2]; for (int i = 0; i * (f[k - 2] + f[k - 1]) <= n; i++) { int temp = n; temp -= i * f[k - 2]; if (temp % f[k - 1] == 0) ans++; }

C-Ntarsis' Set

题目大意

已知一个集合 S=1,2,3...,101000 ,同时有一个长度为 n 的序列 a ,表示我们每次都要删除 S 中的第 ai 项,求经过 k 次操作后最小的数字

思路

我们发现只有当一个数比它小的数都删完后它有成为答案的机会,所以我们 check 掉比它小的数,mid>1 就说明这个数存在(减去比它小的),然后如果比它小的值都去掉了,那么就记录答案,否则就将答案范围放大

bool check(LL k, LL mid) { while (k--) mid -= lower_bound(a + 1, a + n + 1, mid) - a - 1; return mid > 1; }
while (l + 1 < r) { LL mid = (l + r) >> 1; if (check(k, mid)) ans = mid, r = mid; else l = mid; }

__EOF__

本文作者ljfyyds
本文链接https://www.cnblogs.com/ljfyyds/p/17599102.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ljfyyds  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示