2025-5 人类智慧题汇总

ARC198a

给你一个集合,包含1~n所与数
要求一个最大子集,满足任意两个数x,y,满足x % y != 1。

答案是 n = 1 集合是1
n> 1 集合是2^k


ARC198b

一个环,上面有3种数0,1,2,其中0就代表两侧比他小的有0个,以此类推。


首先有一个废话的性质: 1两边有且必须有1个0,2两边必须不能有2

我们设X,Y,Z分别表示0,1,2的个数

我们可以通过这两个废话的性质来推出两个式子作为条件。

思路是,由于1和2都有约束,所以我们就考虑要最大化1或者2的数量。

我们现在来最大化2的数量,2最多时,两边不能放2,显然也不能放1,所以只能放0.

0最少也得和2间隔放置,所以第一个条件 x >= z

然后我们最大化1的数量,1最多时候,需要有0来满足条件,我们发现一个0侧面最多可以贴2个1,所以 x * 2 >= y。


看似做完了 吗?

如果现在交,会WA一半。

我们又想一些边界情况,想啊想,突然发现1的条件似乎没有完全满足,因为你弄101101101的时候如果1的数量是奇数,由于环的性质,会导致一个1两侧都是1。
所以我们就至少需要满足还要一个2来填充。

if (z == 0 && (y % 2 != 0)) {
            std::cout << "No\n";
        } else {
            if (x >= z && 2 * x >= y) {
                std::cout << "Yes\n";
            } else {
                std::cout << "No\n";
            }
        }

ARC C Error Swap

不要问我为什么ARC三道都是人类智慧

给你一个序列A和一个序列B

你需要构造一种交换方案,把A变成B,可能不合法

交换方案是,从A里面选出来i <= j,然首Ai <- Aj-1 : Aj <- Ai+1

乍一看非常的不可做啊,考虑去贪心。
我们发现如果可能的话,把一个数上升或者下降是很容易的。

比如要上升的话只需要选后面随便一个至少比自己大2的就行了
下降就需要选一个最大和自己相等的数。

然是这样会导致可能反复跳不合法,因为你并没有一个向后选数的规则,你是随便选的。

我们发现长度和大小都小于100,而交换此次数只需小于30100即可。

我们考虑约束,减的时候只能减1。这样的话就稳定了。

然后再想不合法,首先两个序列如果和不相同一定是不合法的。

然后其他情况,就是你换不过来了不合法。具体我不会证,但是可以过。


posted @ 2025-05-26 20:26  Dreamers_Seve  阅读(23)  评论(0)    收藏  举报