7 条题解
-
-1
给你一个序列 。你可以对这个序列进行若干次操作。
设一次操作前序列长度为 ,那么这次操作你可以选择一个整数 使得 且 ,删除 并把 的值设成任意整数。
求你最多能进行多少次操作。
假设序列分为 段,第 段的数均为 ,第 段的长度为 。
此处
- ;
- 对于 ,。
那么序列 可以表示为这样:
$$a=\underbrace{t_1,t_1,\cdots,t_1}_{l_1\,\text{个}},\cdots\underbrace{t_x,t_x,\cdots,t_x}_{l_x\,\text{个}} $$
容易发现,如果 ,即 数组全部都是一个数的话,那么是无法操作的,输出 即可。
否则,序列至少存在 和 。
此时 可以与第 个数 消掉,得到一个数 。
由于可以将 的值设为任意整数,那么 ,使得对于 ,有 。
那么可以用 消掉第 个数,此时序列可以变为:
$$a=\underbrace{t_1,t_1,\cdots,t_1}_{l_1-1\,\text{个}},p $$由于 ,所以从后向前消,最后序列可以变为
容易发现,此时序列操作了 次。
综上所述,分类讨论:
- 如果 由一个数构成,输出 ;
- 反之,输出 。
#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
- 上传者