CF1788

CF1788

A. One and Two

Statement

给你一个数列 $ a_1, a_2, \ldots, a_n $ . 数列中的每一个数的值要么是 $ 1 $ 要么是 $ 2 $ .
找到一个最小的正整数 $ k $,使之满足:

  • $ 1 \leq k \leq n-1 $ , and
  • $ a_1 \cdot a_2 \cdot \ldots \cdot a_k = a_{k+1} \cdot a_{k+2} \cdot \ldots \cdot a_n $ .

Solution

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

有解找到 \(\frac{n}{2}\) 处即可。

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,2\dots 2m\) 两两配对,显然会形成 \(m\) 对数。定义一对数的价值是两个数之和,希望构造一种方案使得这 \(m\) 对数的价值形成一个长度为 \(m\),并且公差为 \(1\) 的等差数列。

Solution

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

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

  • \(1,3,...,n\)
  • \(2,4,...,n-1\)

此时我们考虑通过调整 \(b_i\) 使得公差调整为 \(1\),则 \(b_i\) 每次 \(-1\)

那么考虑两组怎么凑出来 \(b_i\) 了,显然是 \(2\times n\)\(3\times \frac{n+1}{2}-2\)

然后递减就行了。

Code

E. Sum Over Zero

Statement

给你一个长度为 \(n\) 的序列 \(a_1,a_2 ... a_{n-1},a_n\),现在请你找到这个序列的若干个不相交的合法子段

对于你选择的一个子段 \([x,y]\),其为一个合法子段当且仅当 \(\sum^{i\leq y}_{i=x} a_i \geq 0\),即子段的区间和非负。对于一个合法的子段 \(S=[x,y]\),我们记 \(f(S)=(y-x+1)\),且当子段 \(S\) 为空时, \(f(S)=0\)

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

Solution

考虑朴素的 dp

\(dp_i\) 表示前 \(i\) 项最少不选多少。

\(dp_i=dp_{i-1}+1\),可以不选。

\(dp_i=0 (sum_i\ge0 )\),前缀均可选。

\(dp_i=\min\limits_{sum_i-sum_j\ge0}dp_j\),一段连续的大于等于 \(0\) 的区间。

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

Code

posted @ 2023-10-25 15:35  Zimo_666  阅读(206)  评论(0)    收藏  举报