蓝桥杯题目理解

1. 一维差分

1.1. 小蓝的操作

1.1.1. 题目解析:

这道题提到了对于"区间"进行操作,而差分数列就是对于区间进行操作的好方法。

观察差分数列:

给定数列:1 3 5 2 7 1

差分数列:1 2 2 -3 5 6

  1. 题目要求把原数组全部变成1,那就是说要让差分数组变成以1开头,其余元素均为0的数列。
  2. 题目又要求是最少操作次数,对应于原数组来说,就应该是每次都使得尽可能长的区间减1,对于差分数列来说,就是使i位置减1,并且应该是不碰到负数的情况。
    1. 差分数列的第i个位置进行+/-操作,对于原数组来说,就是从i往后的所有位置都进行同样的操作了。
    2. 碰到负数了,就不应该减1了,因为最后的目标是使得所有后面的元素都是0(也就意味着,本次减1的操作区间,到此中断了)
  1. 所以就是让差分你数列的某个区间:
    • 一个+1,一个-1 => 对于一个区间进行操作
    • 让某个数字-1 => 从当前一直操作到末尾
  • 最后要使得整个差分数列为10...0...0的形式
  • 操作的次数就是正数的次数(归纳得到)
  • 但是首位要为1,所以还需要考虑的是将首位,减到1就停止。

补充:差分数列对于区间的操作:

    1. [l,r]操作:a[l]+d && d[[r+1]-d => 给[l,r]的元素+d
    2. [l,∞)操作:a[l]+d => 给从l开始一直到末尾的元素都+d

1.1.2. 代码

复制代码
package lanqiao;

import java.util.Scanner;

/**
 * 一个数组 a 中共包含 n 个数,问最少多少次操作,可以让 a 数组所有数都变成 1。
 * 操作的内容是:每次操作可以任选一个区间使得区间内的所有数字减 1。数据保证一定有解。
 */
public class 小蓝的操作 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i]=scanner.nextInt();
        }

        // 1. 得到差分数组
        int[] b = new int[n];
        b[0] = a[0];
        // 对于首位,只减到1就停止
        if (b[0] > 1) res = b[0]-1;
        // 2. 本质上是对于差分数组进行修改
        for (int i = 1; i < n; i++) {
            b[i] = a[i] - a[i - 1];
            if (b[i] > 0) res+=b[i];
        }

        System.out.println(res);
    }
}
相关推荐
↣life♚10 分钟前
从SAM看交互式分割与可提示分割的区别与联系:Interactive Segmentation & Promptable Segmentation
人工智能·深度学习·算法·sam·分割·交互式分割
zqh1767364646916 分钟前
2025年阿里云ACP人工智能高级工程师认证模拟试题(附答案解析)
人工智能·算法·阿里云·人工智能工程师·阿里云acp·阿里云认证·acp人工智能
柚个朵朵30 分钟前
Spring的Validation,这是一套基于注解的权限校验框架
java·后端·spring
2301_8035545233 分钟前
c++和c的不同
java·c语言·c++
fie888935 分钟前
用模型预测控制算法实现对电机位置控制仿真
算法
Kent_J_Truman39 分钟前
【交互 / 差分约束】
算法
ghie909044 分钟前
x-IMU matlab zupt惯性室内定位算法
人工智能·算法·matlab
Magnum Lehar1 小时前
3d游戏引擎的Utilities模块实现
c++·算法·游戏引擎
意倾城1 小时前
JVM内存模型
java·jvm
普通的冒险者1 小时前
几个简单的数组小练习(适合初学)
java·数据结构