ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1696B NIT Destroys the Universe

2022-06-27 23:31:51  阅读:105  来源: 互联网

标签:Destroys CF1696B int scanf circ 答案 操作 如题 NIT


第二次打 cf Global Round。

这个第二题是真的思维,代码极短。

问题分析

本题中的 \(\text{mex}(l,r)\) 操作其实就是一个表象,瞄准最终目的 \(\forall a_i,a_i=0\) 就好办。

显然答案只有 \(3\) 种可能:\(0\),\(1\),\(2\)。下面就来证明一下这个简单明了的答案。

结论证明

\(1^{\circ}\) 答案为 \(0\):显而易见,当初始数列为全 \(0\) 时答案为 \(0\)。
\(2^{\circ}\) 答案为 \(1\):把 \(0\) 想成隔板,中间为平台,若连续平台仅一个,设为 \(a_i\) 到 \(a_j\), 则只需一次操作使 \(l=i,r=j\) 即可。如题例 \(2\):

5
0 1 2 3 4

只需使 \(l=2,r=5\) 一次操作即可。

\(3^{\circ}\) 答案为 \(2\):对于除了以上两种情况,如题例 \(3\):

7
0 2 3 0 1 2 0

只需找到最左最右的非零位置 \(l = 2\) 和 \(r = 6\) 进行操作,置为 \(4\),然后再执行一次 \(l=2\),\(r=6\) 即可将 \(a_2\) 到 \(a_6\) 全部置零即将 \(a\) 序列置零。故答案为 \(2\)。
以此类推,可得其他类似情况答案亦为 \(2\)。

综上所述,答案仅可能为 \(0\),\(1\) 或 \(2\)。证毕。

看到这里,代码就很简单了。

Code

#include <stdio.h>
const int N = (int)1e5 + 5;
int n, a[N];
int main(void) {
    int t;
    for (scanf("%d", &t); t--; ) {
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
        int Ans = (a[n] != 0); //末尾值要特殊处理
        for (int i = 2; i <= n; ++i)
            if (a[i] == 0 && a[i - 1] != 0) ++Ans;
		//统一连续平非零平台数
        printf("%d\n", Ans > 1 ? 2 : Ans); //运用所证结论
    }
    return 0;
}

The end. Thanks.

(试探一赞

标签:Destroys,CF1696B,int,scanf,circ,答案,操作,如题,NIT
来源: https://www.cnblogs.com/dry-ice/p/cf1696b.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有