蓝桥云客--回文数组

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;
}
相关推荐
典典分享指南7 分钟前
VS Code Git 工作树:解锁多分支并行开发新体验
算法·决策树·逻辑回归·启发式算法
_Narcissus_38 分钟前
枚举和模拟算法笔记
c语言·数据结构·c++·笔记·算法·模拟·枚举
天疆说44 分钟前
策略的进化:从随心所欲到稳健前行
算法
冻柠檬飞冰走茶1 小时前
《数据结构实验指导-C++语言版》 在顺序表 list 中查找元素 x
开发语言·数据结构·c++·算法·list
happyprince2 小时前
03-深刻观-CodeX哲学与升华(源码)
算法·ai编程
不会打球的王子2 小时前
Day 27:迁移学习与微调 — 站在巨人的肩膀上
算法
数模竞赛Paid answer3 小时前
2025年中青杯数学建模A题康养城市建设求解全过程论文及程序
算法·数学建模·数据分析·中青杯
网安蟹佬霸3 小时前
密码学安全实战:从加密原理到哈希破解的完整攻防指南
网络·算法·安全·web安全·开源·密码学·哈希算法
yangmu32033 小时前
深度解析:短视频是如何通过“算法+神经机制”劫持用户时间的?
算法
LuminousCPP3 小时前
栈和队列专题(四):LeetCode 232. 用栈实现队列|双栈分工 + 按需迁移 + 摊还 O(1)
c语言·数据结构·笔记·算法·leetcode