构成回文数组

原文链接:https://blog.csdn.net/qq_55207368/article/details/147232170

小红有一个整数数组,长度为n。她希望通过一系列操作将数组变成一个回文数组。每次操作可以选择数组中任意两个相邻的元素 ai和 ai+1,将它们的值同时加一。请你计算至少需要多少次操作使得数组变成一个回文数组。如果不可能,则输出-1。否则输出具体的操作方案。
注意:回文数组指该数组从左到右与从右到左完全相同,
输入描述
第一行包含一个正整数 n(1 ≦ n ≦ 10^5),表示数组的长度。
第二行包含n个整数,表示数组的名个元素 ai(1 ≦ ai ≦ 10^9)
输出描述
如果不能通过操作使得数组变成回文数组,则输出-1
否则先输出一个整数 m,接下来 m 行,每行包含两个整数i和 x,表示将 ai 和 ai+1 同时加 x,表示进行了x次操作。你需要保证 0≤ m ≤n,x>0,并且x累加最小。如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。

 

输入
3
1 3 2
输出
1
1 1

知识点:

1.emplace_back 是 C++ 中 vector 容器的一个成员函数,用于在 vector 的末尾直接构造一个新元素,而不是先创建临时对象再拷贝或移动到容器中。

operations.emplace_back(i + 1, diff);
operations.push_back(std::make_pair(i + 1, diff));

operations.push_back(std::pair<int, long long>(i + 1, diff));

#include <iostream>
#include <vector>
using namespace std;

int main() {    
    int n;
    cin >> n;
    vector<long long> a(n);
    for (int i = 0; i < n; ++i) {
        cin >> a[i];
    }
    
    vector<pair<int, long long>> operations;
    bool possible = true;
    
    for (int i = 0, j = n - 1; i < j; ++i, --j) {
        if (a[i] == a[j]) {
            continue;
        }
        
        if (i + 1 > j - 1) {  // 只剩中间两个相邻元素
            possible = false;
            break;
        }
        
        if (a[i] < a[j]) {
            long long diff = a[j] - a[i];
            a[i] += diff;
            a[i + 1] += diff;
            operations.emplace_back(i + 1, diff);  // 操作i+1位置x次
        } else {
            long long diff = a[i] - a[j];
            a[j] += diff;
            a[j - 1] += diff;
            operations.emplace_back(j, diff);  // 操作j位置x次
        }
    }
    
    // 再次检查是否真的变成回文
    for (int i = 0, j = n - 1; i < j; ++i, --j) {
        if (a[i] != a[j]) {
            possible = false;
            break;
        }
    }
    
    if (!possible) {
        cout << -1 << endl;
    } else {
        cout << operations.size() << endl;
        for (const auto& op : operations) {
            cout << op.first << " " << op.second << endl;
        }
    }
    
    return 0;
}

 

posted @ 2025-08-10 17:14  最近饭吃的很多  阅读(30)  评论(0)    收藏  举报