当前位置: 首页 > article >正文

蓝桥杯 回文数组

问题描述

小蓝在无聊时随机生成了一个长度为 n 的整数数组,数组中的第 i 个数为 a_i,他觉得随机生成的数组不太美观,想把它变成回文数组,也就是对于任意 i ∈ [1, n] 满足:

a_i = a_(n-i+1)

小蓝一次操作可以指定相邻的两个数,将它们一起加 1 或减 1;也可以只指定一个数加 1 或减 1。请问他最少需要操作多少次才能把这个数组变成回文数组?


输入格式

  • 输入的第一行包含一个正整数 n,表示数组的长度。
  • 第二行包含 n 个整数 a_1, a_2, ..., a_n,相邻整数之间使用一个空格分隔。

输出格式

输出一行,包含一个整数,表示最少需要的操作次数。


样例输入

4
1 2 3 4

样例输出

3

样例说明

第一次操作将 a_1, a_2 加 1,变为 2, 3, 3, 4

后面两次操作将 a_1 加 1,变为 4, 3, 3, 4


评测用例规模与约定

  • 对于 20% 的评测用例,1 ≤ n ≤ 10
  • 对于所有评测用例,1 ≤ n ≤ 10^5-10^6 ≤ a_i ≤ 10^6

c++代码

#include<bits/stdc++.h>
#include<stdio.h>

using namespace std;

typedef long long ll;

ll n;
vector<ll> arr;
vector<ll> tar;

int main() {
    scanf("%lld", &n);
    ll k = n / 2, ans = 0;
    arr = vector<ll>(k);
    tar = vector<ll>(k);
    for (ll i = 0; i < k; i++) {
        scanf("%d", &arr[i]);
    }
    if (n % 2 != 0) scanf("%d", &n);
    for (ll i = 0; i < k; i++) {
        scanf("%d", &tar[k - i - 1]);
    }
    while(true) {
        bool key = false;
        for (ll i = 0; i < k - 1; i++) {
            if (arr[i] > tar[i] && arr[i + 1] > tar[i + 1]) {
                key = true;
                int w = min(arr[i] - tar[i], arr[i + 1] - tar[i + 1]);
                arr[i] -= w;
                arr[i + 1] -= w;
                ans += w;
            }
            else if (arr[i] < tar[i] && arr[i + 1] < tar[i + 1]) {
                key = true;
                int w = min(tar[i] - arr[i], tar[i + 1] - arr[i + 1]);
                arr[i] += w;
                arr[i + 1] += w;
                ans += w;
            }
        }
        if (!key) {
            for (ll i = 0; i < k; i++) {
                ans += abs(arr[i] - tar[i]);
            }
            break;
        }
    }
    printf("%lld", ans);
    return 0;
}//by wqs

解题思路

贪心算法

每次遍历只要有相邻的数同时大于或者同时小于对应回文数,则对两个数同时操作。

没有任何一对这样的数的时候,再单独操作。


http://www.kler.cn/a/599000.html

相关文章:

  • VLAN综合实验
  • x86 Docker镜像转换为 ARM 架构镜像
  • 我的Go学习路线概览
  • Git安装与使用详解
  • GPT与Bert,预训练语言模型
  • React--》文件上传优化技巧与最佳实践
  • 纯血鸿蒙:中国操作系统自主创新的里程碑
  • MediaPipe实时机器学习框架
  • 前端 AI IDE应用优缺点
  • NFS客户端与服务端用户不一致问题
  • android初学
  • 负载均衡的在线OJ项目
  • Python与数据库
  • Qt调用Miniconda的python方法
  • JavaScript取整进一位的实现
  • 代码随想录_动态规划
  • 分享最近前端面试遇到的一些问题
  • Redis的持久化初步了解
  • 【机器学习chp14 — 4】生成式模型—扩散模型 Diffiusion model(超详细分析,易于理解,推导严谨,一文就够了)
  • 前端解决跨域的几种方案