2021牛客多校1G Game of Swapping Numbers (思维题)

开始补题QWQ
题意:
给两个数组AB,任选A中任意两个数交换,共进行K次,求结束后|a[i]-b[i]|总和的最大值
易知:|ai-bi|=max(ai,bi)-min(ai,bi)
所以可以让c数组取较大值,d数组取较小值

c[i] = max(a[i], b[i]);
d[i] = min(a[i], b[i]);

此时ci>di,cj>dj
di>cj
|ci-di|+|cj-dj|=ci+dj-ci-dj
交换di和dj
|ci-dj|+|cj-di|=ci-cj+di-dj
两者的差值为:2di-2cj
其中di=min(ai,bi) cj=max(aj,bj)
本次交换后的收益是2*min(ai,bi)-2*max(aj,bj)
di<cj时,两者差值为0
所以要找出前K个最大的2*min(ai,bi)-2*max(aj,bj)若其小于0,则可以提前结束
数论的快乐就在于此QWQ

#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int a[N], b[N], n, k;
int c[N], d[N];
long long ans;

bool cmp(int a, int b) {
    
    
	return a > b;
}

int main() {
    
    
	cin >> n >> k;
	for (int i = 1; i <= n; i++) {
    
    
		cin >> a[i];
	}
	for (int i = 1; i <= n; i++) {
    
    
		cin >> b[i];
	}
	for (int i = 1; i <= n; i++) {
    
    
		ans += abs(a[i] - b[i]);
		c[i] = max(a[i], b[i]);
		d[i] = min(a[i], b[i]);
	}
	sort(c+1, c + 1 + n);
	sort(d+1, d + 1 + n, cmp);
	for (int i = 1; i <= min(n, k); i++) {
    
    
		if (d[i] - c[i] < 0)
			break;
		ans += (long long)2 * (d[i] - c[i]);
	}
	cout << ans << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/fdxgcw/article/details/119773575