A. AquaMoon and Two Arrays
题目链接:https://codeforces.com/contest/1546/problem/A
所用算法:
思维题,数组操作
题意:
给定两个数组 a,b,每次可以选取 a 数组中 i 位置和 j 位置的元素,使 a[i]减一,a[j]加一,问要如何操作才能使 a 数组变为 b 数组。t 次询问,若给定的 a 数组能够经过操作变成 b,输出操作次数以及每次操作选定的 i 和 j(若有若干种方案,任意输出一种即可),若 a 无法变成 b,输出-1。
思路:
对 a 数组和 b 数组求和,若两个数组中数的和相等,则一定可以经过若干次操作使 a 变成 b,因此若和不同则输出-1,若和相同则计算 a 数组和 b 数组每个元素的差值存为差值数组,统计差值绝对值之和,差值绝对值之和除以 2 即为操作次数,遍历差值数组,每次选取一个值为正数的位置和值为负数的位置即可
代码:
#include <iostream>
using namespace std;
typedef long long ll;
const int maxn = 105;
int a[maxn], b[maxn], dif[maxn];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
ll sum1 = 0, sum2 = 0, difsum = 0;
for (int i = 0; i < n; i++)
{
cin >> a[i];
sum1 += a[i];
}
for (int i = 0; i < n; i++)
{
cin >> b[i];
sum2 += b[i];
dif[i] = a[i] - b[i];
difsum += abs(dif[i]);
}
if (sum1 != sum2)
cout << -1 << endl;
else
{
cout << difsum / 2 << endl;
for (int i = 0; i < difsum / 2; i++)
{
for (int j = 0; j < n; j++)
{
if (dif[j] > 0)
{
dif[j]--;
cout << j + 1 << " ";
break;
}
}
for (int j = 0; j < n; j++)
{
if (dif[j] < 0)
{
dif[j]++;
cout << j + 1 << endl;
break;
}
}
}
}
}
}