CF1788

CF1788

A. One and Two

Statement

给你一个数列 a1,a2,,an . 数列中的每一个数的值要么是 1 要么是 2 .
找到一个最小的正整数 k,使之满足:

  • 1kn1 , and
  • a1a2ak=ak+1ak+2an .

Solution

无解当且仅当序列中 2 的个数为奇数时。

有解找到 n2 处即可。

Code

B. Sum of Two Numbers

Statement

给定一个 n,选取任意满足条件的两个非负整数 x,y ,使得 x,y 满足如下条件:

  • x+y=n
  • x,y 的各位数字之和相差不超过 1

多测,共有 T 组数据。

Solution

随机化。随机两个数然后判断是否满足条件。随机几次基本就正确了。概率还是挺高的。

Code

C. Matching Numbers

Statement

给定 m,如果将 1,22m 两两配对,显然会形成 m 对数。定义一对数的价值是两个数之和,希望构造一种方案使得这 m 对数的价值形成一个长度为 m,并且公差为 1 的等差数列。

Solution

考虑偶数一定不会有什么前途,而且稍微想一下也会发现不会有什么前途。

考虑奇数的情况,我们把数 [1,n] 分为两部分:

  • 1,3,...,n
  • 2,4,...,n1

此时我们考虑通过调整 bi 使得公差调整为 1,则 bi 每次 1

那么考虑两组怎么凑出来 bi 了,显然是 2×n3×n+122

然后递减就行了。

Code

E. Sum Over Zero

Statement

给你一个长度为 n 的序列 a1,a2...an1,an,现在请你找到这个序列的若干个不相交的合法子段

对于你选择的一个子段 [x,y],其为一个合法子段当且仅当 i=xiyai0,即子段的区间和非负。对于一个合法的子段 S=[x,y],我们记 f(S)=(yx+1),且当子段 S 为空时, f(S)=0

对于你选择的这若干个不相交合法子段,请最大化Sf(S)并输出这个最大值

Solution

考虑朴素的 dp

dpi 表示前 i 项最少不选多少。

dpi=dpi1+1,可以不选。

dpi=0(sumi0),前缀均可选。

dpi=minsumisumj0dpj,一段连续的大于等于 0 的区间。

这样的东西直接离散化前缀和然后在线段树上维护就行了,具体的可以参考代码。

Code

posted @   Zimo_666  阅读(177)  评论(0编辑  收藏  举报
相关博文:
·  CF1774
·  CF1859
·  CF1295
·  CF1798C
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示