题意:
思路:
最小化值肯定是贪心的想。
对a , b的操作本质都是缩小差值,所以可以归到一类。
将差值都计算出来,优先对差值大的进行操作,所以将差值都放入优先队列里,每次弹出最大的进行− 1的操作。
不能直接将最大的减去k,因为有可能还有次大的,比如9/8 ,应该先将9变成8,再将8变成7,再将第二个8变成7
代码:
// Problem: 最小的和 // Contest: AcWing // URL: https://www.acwing.com/problem/content/description/3998/ // Memory Limit: 256 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://cpeditor.org) #include<bits/stdc++.h> using namespace std; typedef long long ll;typedef unsigned long long ull; typedef pair<ll,ll>PLL;typedef pair<int,int>PII;typedef pair<double,double>PDD; #define I_int ll inline ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;} #define read read() #define rep(i, a, b) for(int i=(a);i<=(b);++i) #define dep(i, a, b) for(int i=(a);i>=(b);--i) ll ksm(ll a,ll b,ll p){ll res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;} const int maxn=4e5+7,maxm=1e6+7,mod=1e9+7; ll a[maxn],b[maxn]; int main(){ ll n=read,k1=read,k2=read,k=k1+k2; rep(i,1,n) a[i]=read; rep(i,1,n) b[i]=read; priority_queue<ll>q; for(int i=1;i<=n;i++) if(a[i]!=b[i]) q.push(abs(a[i]-b[i])); while(!q.empty()){ if(!k) break; ll t=q.top(); q.pop(); t--;k--; if(t) q.push(t); if(!k) break; } ll ans=0; if(q.empty()) ans=ans+k%2; else{ while(!q.empty()){ ans=ans+q.top()*q.top(); q.pop(); } } cout<<ans<<endl; return 0; }