IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Codeforces-1672 C: Unequal Array -> 正文阅读

[C++知识库]Codeforces-1672 C: Unequal Array

Codeforces-1672 C: Unequal Array

题目

题目截图

在这里插入图片描述

样例描述

在这里插入图片描述

题目大意

? 给定一个长度为 n n n 的数组 a a a。定义这个数组的相等性为满足条件 a i = a i + 1 , i ∈ [ 1 , n ? 1 ] a_i=a_{i+1},i\in[1,n-1] ai?=ai+1?,i[1,n?1] i i i 的数量。
? 现在可以对这个数组做一些操作,可以选择一个下标 i ∈ [ 1 , n ? 1 ] i \in [1,n-1] i[1,n?1],将 a i a_i ai? a i + 1 a_{i+1} ai+1? 都设置为 x x x,问最少需要多少次操作,能够让 这个数组的相等性 ≤ 1 \le 1 1。-

题目解析

? 首先考虑一般的情况,我们假设有 a = [ ? X X X X ? Y Y Y ? Z Z Z ? ? ] a = [\cdots XXXX\cdots YYY \cdots ZZZ \cdots] a=[?XXXX?YYY?ZZZ?],显然这个数组是不符合相等性条件的,那么我们怎么样使用给定的方法消除里面相等的部分呢?
? 首先,我们注意到一共只有不超过 2 e 5 2e5 2e5 的数,但数值范围有 1 e 9 1e9 1e9,这意味着我们赋值的时候每次都赋值 x x x 为从没出现过的数就好了。然后,对于多个连续相等的情况,我们从第一段第二位开始,就要赋值 x x x 了,这样带来的结果是 a = [ ? X A A X ? Y Y Y ? Z Z Z ? ? ] a = [\cdots XAAX\cdots YYY \cdots ZZZ \cdots] a=[?XAAX?YYY?ZZZ?],根据题目要求,我们只有最后只有两个数是相等且连续出现的,但我们每次赋值,都必然会留下一个相等连续出现的数,这使得我们必须接着向后进行 a = [ ? X A B B ? Y Y Y ? Z Z Z ? ? ] a = [\cdots XABB\cdots YYY \cdots ZZZ \cdots] a=[?XABB?YYY?ZZZ?],看到这里,我们不难发现,按这样赋值,每次我们都可以将首次出现连续相等的位置向后移动一位,显然,当到最后一次时, a = [ ? X A B C ? D D Z ? ? ] a = [\cdots XABC\cdots DDZ \cdots] a=[?XABC?DDZ?],这样,我们就能得到题目想要的结果。这个过程中,设首次出现连续相等段的起点为 s,最后一次出现的终点为 e,那么显然这样结果就是 ( e ? 1 ) ? ( s + 1 ) = e ? s ? 2 (e - 1) - (s + 1) = e - s - 2 (e?1)?(s+1)=e?s?2
? 特别地,需要注意两个地方,一个是本就满足条件的情况( e d < s t ed \lt st ed<st 对应连续段唯一且长度只有 2 2 2 或没有连续段),另一个是连续段长度为 3 3 3 时,我们只需要赋值一次,此时答案应为 1 1 1

Code

#include <bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 7;
int a[maxn], b[maxn], cnt[maxn];

int main() {
    int t, n;
    cin >> t;
    while(t--) {
        cin >> n >> a[1];
        int st = 0, ed = -1;
        for(int i=2; i<=n; ++i) {
            cin >> a[i];
            if(st == 0 && a[i] == a[i-1]) st = i;
            if(a[i] == a[i-1]) ed = i - 1;
        }
        if(ed < st) cout << 0 << endl; else
        cout << max(1, ed - st) << endl;
    }
    return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-27 11:09:20  更:2022-04-27 11:10:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 21:17:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码