首页 > 试题广场 >

操作数组

[编程题]操作数组
  • 热度指数:443 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个长度为n的数组ab(下标从1开始),你的目标是使a=b,为了完成你的目标,你可以执行以下操作任意次(也可以是0次):

  • 选择两个正整数i,j,满足1 \le i,j \le ni \not = j,使a_{i}变成a_{i} -1a_{j}变成a_{j} +1

尽管你可以执行任意次操作,但这里求的是最小操作次数。如果无论如何都不能使a = b,请报告。

输入描述:
第一行包含一个正整数n (2 \leq n \leq 10^{5})n表示数组的长度。

第二行包含n个正整数a_1,a_2,\ldots,a_n (1\le a_{i} \le 10^9)

第三行包含n个正整数b_1,b_2,\ldots,b_n (1\le b_i\le 10^9)


输出描述:
输出包含一个整数,表示最小操作次数。如果无论如何都不能使a = b,输出-1
示例1

输入

4
1 2 3 4
4 3 2 1

输出

4
头像 憨憨的竹林
发表于 2026-05-04 00:12:57
很简单的题目呀 首先我们要保证两个数组的元素之和是相等的,否则移来移去也只是在做无用功。 确保这个前提之后,我们每次操作都同时选中一个 与一个 去进行操作即可,所以最后操作数量实际上就是 了 代码如下: #include <bits/stdc++.h> using namespac 展开全文
头像 AliLexiWalker
发表于 2026-05-04 00:07:33
若两数组总和不等则无法实现后续操作;否则最少操作数为所有需增加位置的差值之和:。 void solve(){ int n;cin>>n; vll a(n),b(n); for(int i=0;i<n;++i)cin>>a[i]; for( 展开全文
头像 lotusor
发表于 2026-05-04 00:47:23
操作都是一加一减,所以初始值一定要相同,加多少减多少只需要记住总共需要加或减多少就行了 n = int(input()) a = list(map(int,input().split())) b = list(map(int,input().split())) if sum(a) != sum(b) 展开全文
头像 BeauWill
发表于 2026-05-04 02:35:14
Modern Cpp #include <iostream> #include <vector> #include <numeric> using i64 = long long; int main() { std::ios::sync_with_stdi 展开全文
头像 此在Dasein
发表于 2026-05-04 01:43:44
1. 问题分析 该问题的本质是一个带有守恒约束的线性变换问题。 操作特性:每次操作选择两个不同的索引 ,使 减 1,同时 加 1。这一操作在数学上等价于在数组元素之间进行“单位增量的转移”。 和的不变性(Invariant):无论执行多少次操作,数组 的元素总和 始终保持不变。 目标状态: 展开全文
头像 腌萝卜干
发表于 2026-05-04 14:55:19
简单题 #include <bits/stdc++.h> #define x first #define y second #define all(x) x.begin(), x.end() #define vec1(T, name, n, val) vector<T> n 展开全文
头像 想去杭州的沸羊羊在刷代码
发表于 2026-05-04 20:06:34
#include <bits/stdc++.h> using namespace std; #define int long long signed main() { int n; cin>>n; int sum=0; int a[n+2]; int b[n+2]; 展开全文
头像 白子伍
发表于 2026-05-04 22:02:56
import sys # for line in sys.stdin: # a = line.split() # print(int(a[0]) + int(a[1])) def solve(): input = sys.stdin.readline n = in 展开全文