您的位置:首页 > 其它

CodeForces 960 B.Minimize the error

2018-04-09 15:48 246 查看
题意
给你两个数字序列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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐