题意
给你两个数字序列a,b,每个序列长度都为n,然后E=∑(a[i]-b[i])^2。现在你可以改变a,b序列中的元素k1次和k2次,每次可以使一个元素加一或者减一。使得改变结束之后E的值最小。
题解
用一个数组来存入abs(a[i]-b[i])的值,有k1+k2的操作(+1/-1),以绝对值从小到大排,大于的-1,小于0的+1,暴力解决,不会超时,然后在遍历平方加起来。
#include <bits/stdc++.h> using namespace std; const int maxn = 1005; long long number1[maxn], number2[maxn], ans[maxn]; bool cmp(long long a, long long b){ return abs(a) < abs(b); } int main(){ int n, k1, k2; while(cin>>n>>k1>>k2){ memset(ans, 0, sizeof(ans)); memset(number2, 0, sizeof(number2)); memset(number1, 0, sizeof(number1)); for(int i = 0; i < n; i++){ cin>>number1[i]; } for(int i = 0; i < n; i++){ cin>>number2[i]; } for(int i = 0; i < n; i++){ ans[i] = abs(number1[i]-number2[i]); } sort(ans, ans+n, cmp); int t = k1 + k2; while(t){ if(ans[n-1] < 0){ ans[n-1]++; } else{ ans[n-1]--; } t--; sort(ans, ans+n, cmp); } long long sum = 0; for(int i = 0; i < n; i++){ sum += ans[i]*ans[i]; } cout<<sum<<endl; } }