构成回文数组
原文链接: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; }
浙公网安备 33010602011771号