蓝桥云客--回文数组

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;
}
相关推荐
Lei_3359673 分钟前
[算法]十大排序
数据结构·算法·排序算法
大数据张老师30 分钟前
数据结构——堆排序
数据结构·算法·排序算法
仰泳的熊猫1 小时前
LeetCode:268. 丢失的数字
数据结构·c++·算法·leetcode
小龙报1 小时前
《算法通关指南数据结构和算法篇(3)--- 栈和stack》
开发语言·数据结构·c++·算法·创业创新·学习方法·visual studio
CoovallyAIHub2 小时前
智能“下沉”:边缘AI,更低功耗、更快响应、更强隐私,YOLO26只是开始
深度学习·算法·计算机视觉
Lear3 小时前
【链表】LeetCode 142.环形链表
算法
CoovallyAIHub3 小时前
2025目标检测模型全景图:从RF-DETR到YOLOv12,谁主沉浮?
深度学习·算法·计算机视觉
澪吟3 小时前
算法性能的核心度量:时间复杂度与空间复杂度全解析
数据结构·算法
咪咪渝粮3 小时前
108. 将有序数组转换为二叉搜索树
算法·leetcode
lzptouch3 小时前
蚁群(Ant Colony Optimization, ACO)算法
人工智能·算法·机器学习