首页 > 其他分享 >适用于初学者的CF1654E Arithmetic Operations题解

适用于初学者的CF1654E Arithmetic Operations题解

时间:2023-02-25 17:45:14浏览次数:30  
标签:Operations CF1654E 公差 题解 sqrt 枚举 计算出来 等差数列 数字

题目让我们求改变数字的最少次数,那我们转化一下,

求可以保留最多的数字个数 \(cnt\),再用 \(n\) 减一下就行,即 \(res = n - cnt\)。

我们先考虑两种暴力方法。

第一种暴力方法:

首先,我们要知道一个概念。

image

那么我们可以枚举公差 \(d\)(就是数组中相邻两项的差值都是 \(d\)),我们假定,并把题目中的每个 \(a[i]\) 对应的等差数列的最后一项 \(a[i] + d \times (n - i)\) 计算出来。

对于同一个公差 \(d\),如果不同位置计算出来的序列的最后一个值相同,那就说明它们属于同一个等差数列。

image

如果有 \(x\) 个数字计算出来的最后一个值都相同,那么采用其对应的等差数列作为修改后的数组,这 \(x\) 个数字是不需要改变的,只需要改变 \(n - x\) 个数字。

那我们可以想到,用桶记录计算出来的值 \(x\) 的出现次数 \(a[x]\)。如果某一次计算出来的值为 \(x\),那么可以将 \(a[x]\) 加 \(1\)。

如果 \(a[x]\) 是 \(a\) 中最大的元素,那么说明,以 \(a[x]\) 为结尾的等差数列中存在的元素数量最多,那么更改数字的数量也就减少了。

这种方法的时间复杂度为 \(O(DN)\),\(D\) 为需要枚举的公差数量。

第二种暴力方法:

考虑动态规划,设 \(f[i][j]\) 表示以 \(a[i]\) 为等差数列最后一个元素的以 \(j\) 为公差的等差数列最多可以保留的数字个数

我们可以枚举上一个数字 \(a[k]\),如果它与 \(a[i]\) 在同一等差数列,那么有 \(f[i][j] = f[k][j] + 1\),表示又可以多保存一个数字了。

那这个序列的公差是多少呢?

这样考虑,中间有 \(i - j\) 个公差,差了 \(a[i] - a[j]\),那么公差就是\(\frac{a[i] - a[j]}{i - j}\)。

image

如果除不尽怎么办呢,那么这就说明 \(a[i]\) 和 \(a[j]\) 不能在同一个等差数列,不然公差为小数!

那 \(j\) 从哪里开始枚举呢?从 \(1\) 开始是不是太慢了?

这个等会儿讲。


那么为了平衡这两种暴力算法,我们可以这样办:

取输入的数列 \(a\) 的最大值 \(m\)。

我们只使用第一种方法枚举 \([0, \sqrt m]\) 的部分,时间复杂度为 \(O(n \sqrt m)\)。

下面探讨第二种方法的时间复杂度,

首先来探讨 \(j\) 从何处开始枚举,到哪里。

到哪里好解决,就是 \(i - 1\)。

而开始的地方,是 \(i - \sqrt m\)。为啥呢?

首先假设 \(i, j\) 都在同一个等差数列中,如果 \(j + \sqrt m < i\),那么

未完待续。。。

2023/2/25

标签:Operations,CF1654E,公差,题解,sqrt,枚举,计算出来,等差数列,数字
From: https://www.cnblogs.com/PlayWithCPP/p/17154771.html

相关文章

  • CF717A Festival Organization 题解
    传送门首先考虑求出长度为\(i\)的合法串的个数。很明显可以想到用dp解。设\(f_{i,0/1}\)为长度为\(i\)最后一位为\(0/1\)的合法串个数。可以很容易想到转移......
  • ABC267D 题解
    前言题目传送门!更好的阅读体验?两篇题解的代码写得很复杂,我是没有想到。思路很显然对于一个点,它必定会进入一个循环节。如何判断它进入循环节了呢?当一个点被经过两次,......
  • CF1383E 题解
    题意传送门给定一个长度为\(n\)的01串\(a\)。在一次操作中,你可以选择任意一个\(i\in[1,|a|)\),令\(a_i=\max(a_i,a_{i+1})\),然后将\(a_{i+1}\)删除。你可以进行......
  • AtCoder Beginner Contest 287 A-F 题解
    比赛链接A-Majority先这样再那样最后这样,就是这样。点击查看代码#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;intn,a;char......
  • AtCoder Beginner Contest 286 A-G 题解
    比赛链接A-RangeSwap根据题意,分段输出。点击查看代码#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;constintN=105;intn,......
  • P8720 [蓝桥杯 2020 省 B2] 平面切分 题解
    前言建议本题评黄,因为需要较强的数学能力。如果格式炸了去这里看哦题意给出\(N\)条直线的解析式\(y=kx+b\),求出这些直线把平面分成了几部分。思路看到这道题我们......
  • [六省联考 2017] 组合数问题 题解
    题目描述组合数\(C_n^m\)表示的是从\(n\)个互不相同的物品中选出\(m\)个物品的方案数。举个例子,从\((1,2,3)\)三个物品中选择两个物品可以有\((1,2)\),\((1,......
  • 2.25 校内模拟赛 题解
    好消息:签到题首杀。坏消息:只会签到题。\(\text{contestid:726}\)A.随机\(\text{problemid:2307}\)B.回文路径\(\text{problemid:3772}\)成功首杀。看到回......
  • AtCoder Beginner Contest 282 A-F 题解
    比赛链接A-GeneralizedABC额,对,是的,没错,先这样再那样然后这样就是这样。点击查看代码#include<cstdio>intn;intmain(){ scanf("%d",&n); for(inti=0;......
  • #68. 「NOIP2004」津津的储蓄计划 题解
    #68.「NOIP2004」津津的储蓄计划题解题目传送门题目知识点模拟题目分析非常的“明显”,这是一道模拟题。题意说明有可能在某个月的月初,津津手中的钱加上这个月妈妈......