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;
                    }
                }
            }
        }
    }
}

总结:

相似题目:

posted @ 2021-07-16 14:37  Wajor  阅读(102)  评论(0)    收藏  举报