7 条题解

  • -1
    @ 2024-8-4 18:58:04

    Description\textbf{Description}

    给你一个序列 a1,a2,,ana_1, a_2, \ldots, a_n。你可以对这个序列进行若干次操作。

    设一次操作前序列长度为 mm,那么这次操作你可以选择一个整数 ii 使得 1im11 \le i \le m - 1aiai+1a_i \ne a_{i + 1},删除 ai+1a_{i + 1} 并把 aia_i 的值设成任意整数

    求你最多能进行多少次操作。

    Solution\textbf{Solution}

    假设序列分为 x(xn)x\,(x\le n) 段,第 ii 段的数均为 tit_i,第 ii 段的长度为 lil_i

    此处

    • i=1xli=n\sum_{i=1}^{x}l_i=n
    • 对于 i[1,x1]\forall\,i\in[1,x-1]titi+1t_i\not=t_{i+1}

    那么序列 aa 可以表示为这样:

    $$a=\underbrace{t_1,t_1,\cdots,t_1}_{l_1\,\text{个}},\cdots\underbrace{t_x,t_x,\cdots,t_x}_{l_x\,\text{个}} $$

    容易发现,如果 x=1x=1,即 aa 数组全部都是一个数的话,那么是无法操作的,输出 00 即可。


    否则,序列至少存在 t1t_1t2t_2

    此时 t1t_1 可以与第 l1+1l_1+1 个数 t2t_2 消掉,得到一个数 pp

    由于可以将 aia_i 的值设为任意整数,那么 pZ\exist\,p\in\mathbb{Z},使得对于 i[1,x]\forall\,i\in[1,x],有 ptip\not=t_i

    那么可以用 pp 消掉第 l1+1nl_1+1\sim n 个数,此时序列可以变为:

    $$a=\underbrace{t_1,t_1,\cdots,t_1}_{l_1-1\,\text{个}},p $$

    由于 pt1p\not=t_1,所以从后向前消,最后序列可以变为

    a=pa=p

    容易发现,此时序列操作了 n1n-1 次。


    综上所述,分类讨论:

    • 如果 aa 由一个数构成,输出 00
    • 反之,输出 n1n-1

    Code\textbf{Code}

    #include <bits/stdc++.h>
    const int N = 1e5 + 10;
    
    int n, a[N];
    
    int main() {
      std::cin.tie(0)->sync_with_stdio(0);
      std::cin >> n;
      for (int i = 1; i <= n; ++i)
        std::cin >> a[i];
      for (int i = 2; i <= n; ++i) {
        if (a[i] != a[i - 1]) { // 发现不同的数字
          std::cout << n - 1 << std::endl;
          return 0;
        }
      }
      std::cout << 0 << std::endl; // 全部都相同
      return 0;
    }
    

    信息

    ID
    21
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    1510
    已通过
    392
    上传者