CF Round 481 (Div. 3)--D. Almost Arithmetic Progression(思维)

2023-11-15

Polycarp likes arithmetic progressions. A sequence [a1,a2,…,an] is called an arithmetic progression if for each i (1≤i<n) the value ai+1−ai+1− is the same. For example, the sequences [42], [5,5,5], [2,11,20,29] and [3,2,1,0] are arithmetic progressions, but [1,0,1], [1,3,9] and [2,3,1] are not.

It follows from the definition that any sequence of length one or two is an arithmetic progression.

Polycarp found some sequence of positive integers [b1,b2,…,bn]. He agrees to change each element by at most one. In the other words, for each element there are exactly three options: an element can be decreased by 1, an element can be increased by 1, an element can be left unchanged.

Determine a minimum possible number of elements in b which can be changed (by exactly one), so that the sequence b becomes an arithmetic progression, or report that it is impossible.

It is possible that the resulting sequence contains element equals 0.

Input

The first line contains a single integer n (1≤n≤100000) — the number of elements in b.

The second line contains a sequence b1,b2,…,bn (1≤bi≤10^9).

Output

If it is impossible to make an arithmetic progression with described operations, print -1. In the other case, print non-negative integer — the minimum number of elements to change to make the given sequence becomes an arithmetic progression. The only allowed operation is to add/to subtract one from an element (can't use operation twice to the same position).

input

4
24 21 14 10

output

3

题意:给定n个数的序列,对于每一个数,可以进行+1,-1,不动,三种操作,注意每个数只能操作一次,问最少需要操作多少次使得整个序列变成等差序列,如果无解输出-1.

解析:等差数列的特点,如果首项和公差知道,那么整个序列就都知道了,因此我们枚举前两项所有的可能,一共九种,对于每种合法情况对答案取min即可。

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],b[N];
int x[9]={0,0,0,1,1,1,-1,-1,-1};
int y[9]={1,0,-1,1,0,-1,1,0,-1};
void solve()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    if(n<=2)//特判一下
    {
        printf("0\n");
        return;
    }
    int ans=1e9;//设立答案
    for(int i=0;i<9;i++)
    {
        for(int j=1;j<=n;j++) b[j]=a[j];//每种初始拷贝
        b[1]+=x[i],b[2]+=y[i];
        int k=b[2]-b[1],cnt=0;//cnt记录当前情况所需操作次数
        if(x[i]!=0) cnt++;//此处就要累加cnt
        if(y[i]!=0) cnt++;
        bool ok=true;//此情况是否合法
        for(int j=3;j<=n;j++)
        {
            int c=b[j]-b[j-1]-k;//与前一个差值的差
            if(c==0) continue;
            else if(c==1) b[j]--,cnt++;
            else if(c==-1) b[j]++,cnt++;
            else//无解情况
            {
                ok=false;
                break;
            }
        }
        if(ok) ans=min(ans,cnt);
    }
    if(ans==1e9) ans=-1;
    printf("%d\n",ans);
}
int main()
{
    int t=1;
    //scanf("%d",&t);
    while(t--) solve();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CF Round 481 (Div. 3)--D. Almost Arithmetic Progression(思维) 的相关文章

随机推荐

  • QT图片叠加CompositionMode效果一览

    QPixmap tmpPix pix size tmpPix fill Qt transparent QPainter p1 tmpPix p1 setCompositionMode QPainter CompositionMode Sou
  • C++操作Redis的简单例子

    相信做过服务端开发的应该都知道Redis的大名 它是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 我们后台是用C 开发的 问了下他们 用的缓存框架有Redis SSDB 今天看了几个帖
  • linux kill掉其他的登录用户

    为什么80 的码农都做不了架构师 gt gt gt 我们在LINUX下可以使用多个用户在不同地方连接上LINUX服务器 这样也出现一个问题就是会有多个用户登陆到服务器上了 在系统中我们可以使用命令who 或者w 来查看当前有多少个用户登陆了
  • 华为云云耀云服务器 L 实例评测|配置教程 + 用 Python 简单绘图

    文章目录 Part I Introduction Chap I 云耀云服务器 L 实例简介 Chap II 参与活动步骤 Part II 配置 Chap I 初步配置 Chap II 配置安全组 Part III 简单使用 Chap I V
  • 快速入门 Logback

    简介 Logback 旨在作为流行的 log4j 项目的继承者 它是由 log4j 创始人 Ceki Gulcu 设计的 同时它也是 SpingBoot 项目的默认日志框架 安装 因为 logback 需要和 slf4j 一起使用 所以总共
  • react antv g2 图表更新踩坑记录

    记录一下 antv g2 踩的坑 1 声明一个chart let charts useRef 2 通过调接口获取数据源 3 判断是否第一次获取数据源 if 是否第一次获取数据源 enterpriseColumn res data else
  • 踩坑,发现一个ShardingJdbc读写分离的BUG

    前言 最近公司准备接入ShardingJdbc做读写分离了 老大让我们理一理有没有写完数据立马读的场景 因为主从同步是有延迟的 如果写完读取数据走到从库 而从库正好有延迟 没读取到数据 岂不是造成了生产事故 今天我们来看看 Sharding
  • Shell中正则表达式

    1 正则表达式介绍 1 正则表达式 通常用于判断语句中 用来检查某一字符串是否满足某一格式 2 正则表达式是由普通字符与元字符组成 3 普通字符包括大小写字母 数字 标点符号及一些其他符号 4 元字符是指在正则表达式中具有特殊意义的专用字符
  • 参加电子大赛的经验总结,希望对在校大学生有所帮助

    参加电子大赛的经验总结 赵亮 大连理工大学 0 简介 我是大连理工大学03级的学生 参加了05年9月份举办的全国大学生电子设计大赛 最终我们队获得了辽宁省特等奖 全国二等奖的成绩 全国大学生电子设计大赛每两年举办一次 为全国各高校本科生电子
  • osgEarth的Rex引擎原理分析(一零九)19级瓦片分辨率估算

    目标 一零八 中的问题194 rex的瓦片分级为0 1 19 第0级角度分辨率 180 第1级角度分辨率 180 2 第19级角度分辨率 180 2 19 0 00034332275390625 每个瓦片默认像素为256 256 则每个像素
  • Hive常⽤交互命令与属性配置

    文章目录 Hive常 交互命令与变量属性 一 Hive常用交互命令 1 启动集群 2 查看帮助 3 使用参数 1 在Hive命令行里创建一个表student 并插入1条数据 2 打开hive命令 窗 时定义变量 3 打开verbose模式
  • 解决电脑能够登录QQ,但是不能打开网页的问题

    电脑更新Win11之后每次重新开机都会出现能够登录QQ 但是打开不了网页的问题 解决办法分为三种 方法一 让你的电脑管家帮你 最省事的办法 打开你的安全卫士之类的软件 这里我用的是联想自带的联想电脑管家 首先点右上角的小箱子图标 然后在新的
  • Java之美[从菜鸟到高手演变]之JVM内存管理及垃圾回收

    http www cnblogs com likehua p 4023667 html
  • 概述计算机网络五层原理体系结构中各层的功能_请收好这一份详细清晰的计算机网络基础学习指南...

    点击上方 Java后端 选择 设为星标 优质文章 及时送达 来源 简书 作者 Carson Ho 链接 jianshu com p 45d27f3e1196 前言 计算机网络基础是研发 运维工程师都需掌握的知识 但往往会被忽略 今天 我将献
  • 【无标题】苹果手机连接罗技鼠标和蓝牙键盘的设置方法

    苹果手机连接罗技鼠标和蓝牙键盘的设置方法如下 iPhone手机打开鼠标设置的路径 设置 辅助功能 触控 辅助触控 打开 请按以下步骤操作 第一步 第二步 第三步 第四步 到这一步以后 屏幕上会出现一个半透明小圆球 同时也可以蓝牙连接鼠标 连
  • 复习之web服务器--apache

    PS Vim复制小技巧 一 实验环境 两台虚拟机 nodea nodeb 配置ip 搭建软件仓库 关闭selinux root ftp Desktop hostnamectl set hostname nodea westos org ro
  • 多文件上传关于input type=file元素

    我们都知道 html5中有个input type file元素 用该元素可以实现页面上传文件的功能 但一般的做法只是简单的在表单中操作 我来研究一下深层东西 想要了解它 就要知道它的内置对象 files 页面上写一个input 然后选俩个图
  • 【Pytorch with fastai】第 16 章 :训练过程

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • linux-网站服务

    一 概念 1 框架结构 LAMP linux apache mysql PHP 系统 服务器程序 数据管理软件 中间软件 二 静态站点 1 安装Apache 1 root localhost yum y install httpd 安装 r
  • CF Round 481 (Div. 3)--D. Almost Arithmetic Progression(思维)

    Polycarp likes arithmetic progressions A sequence a1 a2 an is called an arithmetic progression if for each i 1 i