题目
大意
两个长度为n的数组A,B
对A进行K1运算,对其中一个数 +1或-1
对B进行K2运算,对其中一个数 +1或-1
求的最小值
思路
Bi+1 《=》Ai-1
Bi-1 《=》Ai+1
所以可以看成是对A序列进行K1+K2次操作,B不操作
那么优先对 | Ai - Bi | 最大值对应的Ai进行操作
利用优先队列 寻找最优Ai
AC代码
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<vector>
#include<cmath>
#include <queue>
using namespace std;
typedef long long ll;
struct pp
{
int a;
int b;
bool operator<(const pp &x)const{
return abs(a-b)<abs(x.a-x.b);
}
}s[1007];
priority_queue<pp> q;
int main()
{
ll ans=0;
int n,k1,k2;
pp t;
cin>>n>>k1>>k2;
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i].a);
}
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i].b);
}
for(int i=1;i<=n;i++) q.push(s[i]);
for(int i=1;i<=k1+k2;i++)
{
t=q.top();
q.pop();
if(t.a>t.b)t.a--;
else t.a++;
q.push(t);
}
while(!q.empty())
{
t=q.top();
q.pop();
ans+=1ll*(t.a-t.b)*(t.a-t.b);
///1LL是为了在计算时,把int类型的变量转化为long long,然后再赋值给long long类型的变量
}
printf("%lld\n",ans);
return 0;
}