题目传送门:Problem - D - Codeforces
题目大意:给定长度为n的数组a和b,定义b数组的价值为,现可以交换一次b数组中的任意两个元素,求b数组的价值最大值。
思路:绝对值问题可以放在数轴上去解决。绝对值即为区间长度。
ps:摘抄大佬
每个对应的 |ai - bi| 就是一条线段,我们只能交换一次,对于每每两条的线段一共就有如上图四种的情况,所以我们要增大我们的贡献值就只有第二种情况可以满足,通俗的说就是找两条相差最远的两条线段他们产生的贡献值就是 2*(l2 - r1) ,代码如下:
#include<bits/stdc++.h> #define int long long using namespace std; typedef pair<int, int> PII; const int N = 1e6 + 110, mod = 1e9 + 7; int ans = 0; int a[N]; int b[N]; void solve() { int n; cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) cin >> b[i]; int mi_r = 1e9; int ma_l = 0; ans = 0; for (int i = 1; i <= n; i++) { if (a[i] > b[i]) swap(a[i], b[i]); mi_r = min(mi_r, b[i]); ma_l = max(ma_l, a[i]); ans += abs(a[i] - b[i]); } if (mi_r < ma_l) { cout << ans + 2 * (ma_l - mi_r)<<"\n"; }else{ cout<<ans<<'\n'; } } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int T; cin >> T; while (T--) { solve(); } return 0; }
标签:思维,ma,int,线段,mi,数组,ans,图形 From: https://www.cnblogs.com/spiderflower/p/17846691.html