题目大意
- 通过将i位置的数做+1操作, j位置的做-1操作使得a数组变成b数组
- 可以转变的话输出操作步数以及每次操作所选的i, j
- 不可以转变的话输出-1
思路
- 通过一篇大佬的博客顿悟
- 若能完成转换两数组差值之和必为0
- 通过差值正负按次输出即可
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n, m, t;
int a[N], b[N], c[N];
int main()
{
cin >> t;
while(t --)
{
memset(a, 0, sizeof a);
memset(b, 0, sizeof b);
memset(c, 0, sizeof c);
cin >> n;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int j = 1; j <= n; j ++) cin >> b[j];
int tem = 0, res = 0;
for(int i = 1; i <= n; i ++)
{
c[i] = a[i] - b[i];
tem += c[i];
if(a[i] - b[i] > 0) res += a[i] - b[i];
}
if(tem == 0)
{
cout << res << endl;
int cnt = 0;
int i;
for( int i = 1; i <= n;)
{
for(int j = i +1; j <= n; j ++)
{
if(c[i] > 0 && c[j] < 0)
{
cnt ++;
c[i] --, c[j] ++;
cout << i << " " << j << endl;
}
else if(c[i] < 0 && c[j] > 0)
{
cnt ++;
c[i] ++, c[j] --;
cout << j << " " << i << endl;
}
}
if(c[i] == 0) i ++;
}
}
else puts("-1");
}
return 0;
}