蓝桥云客--回文数组

0回文数组 - 蓝桥云课

问题描述

小蓝在无聊时随机生成了一个长度为 n 的整数数组,数组中的第 i 个数为 ai​,他觉得随机生成的数组不太美观,想把它变成回文数组,也就是对于任意 i∈[1,n] 满足 ai​=an−i+1​。小蓝一次操作可以指定相邻的两个数,将它们一起加1或减1;也可以只指定一个数加1或减1,请问他最少需要操作多少次能把这个数组变成回文数组?

输入格式

输入的第一行包含一个正整数 n。

第二行包含 n 个整数 a1​,a2​,...,an​,相邻整数之间使用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。

样例输入

复制代码
4
1 2 3 4

样例输出

复制代码
3

样例说明

第一次操作将 a1​,a2​ 加1,变为 2, 3, 3, 4;

后面两次操作将 a1​ 加1,变为 4, 3, 3, 4。

评测用例规模与约定

  • 对于 20% 的评测用例,1≤n≤10;
  • 对于所有评测用例,1≤n≤10^5,−10^6≤ai≤10^6。

思路:

差点的贪心,8/12的测试点

代码:

复制代码
#include <iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const ll N = 1e5+10;
ll n,a[N],ans;
int main() 
{
     ios::sync_with_stdio(0);
     cin.tie(0);
     cout.tie(0);
	cin >> n;
	for(ll i = 1 ; i <= n ; i++)
	cin >> a[i];
	ll l = 1,r = n;
	while(l < r)
	{
		if(a[l] == a[r])
		{
			l++,r--;
		}
		else if(abs(a[l] - a[r]) >= abs(a[l+1] - a[r-1]))
		{
			ans += abs(a[l] - a[r]);
			a[l+1] = a[r-1];
			l++,r--;
		}
		else
		{
			ans += abs(a[l] - a[r]);
			if(a[l+1] > a[r-1])
			{
				a[r-1] += abs(a[l] - a[r]);
			}
			else if(a[l+1] < a[r-1])
			{
				a[l+1] += abs(a[l] - a[r]);
			}
			else
			{
				cout << "报错" << endl;
			}
			l++,r--;
		}
	}
	cout << ans;
    return 0;
}

思路:

可以对数组进行相减n/2的长度。这样是最贪心的

代码:

复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int n;
    cin >> n;
    vector<ll> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    
    int m = n / 2;
    vector<ll> d(m);
    for (int i = 0; i < m; ++i) {
        int j = n - 1 - i;
        d[i] = a[i] - a[j];
    }
    
    ll ans = 0;
    
    for (int i = 0; i < m; ++i) {
        if (d[i] == 0) continue;
        
        if (i + 1 < m) {
            if ((d[i] > 0 && d[i+1] > 0) || (d[i] < 0 && d[i+1] < 0)) {
                ll k = min(abs(d[i]), abs(d[i+1]));
                if (d[i] > 0) {
                    d[i] -= k;
                    d[i+1] -= k;
                } else {
                    d[i] += k;
                    d[i+1] += k;
                }
                ans += k;
            }
        }
        
        ans += abs(d[i]);
        d[i] = 0; // 已经处理完毕,置零避免重复处理
    }
    
    cout << ans << endl;
    
    return 0;
}
相关推荐
Greedy Alg18 小时前
LeetCode 142. 环形链表 II
算法
睡不醒的kun18 小时前
leetcode算法刷题的第三十二天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
先做个垃圾出来………18 小时前
残差连接的概念与作用
人工智能·算法·机器学习·语言模型·自然语言处理
SuperCandyXu20 小时前
P3205 [HNOI2010] 合唱队-普及+/提高
c++·算法·洛谷
_OP_CHEN20 小时前
数据结构(C语言篇):(十二)实现顺序结构二叉树——堆
c语言·数据结构·算法·二叉树·学习笔记··顺序结构二叉树
Yingjun Mo20 小时前
1. 统计推断-基于神经网络与Langevin扩散的自适应潜变量建模与优化
人工智能·神经网络·算法·机器学习·概率论
地平线开发者21 小时前
征程 6 | 灰度图部署链路介绍
算法·自动驾驶
地平线开发者21 小时前
手撕大模型|KVCache 原理及代码解析
算法·自动驾驶
共享家95271 天前
经典动态规划题解
算法·leetcode·动态规划
Pluchon1 天前
硅基计划3.0 Map类&Set类
java·开发语言·数据结构·算法·哈希算法·散列表