定义某数组 xx 的权值为
sum{ sum{ a[i]+b[i] } } i<j<n
现在,给定两个长度为 nn 的数组 a,ba,b。你可以执行若干次操作,每次操作选择一个下标 ii,并交换 ai,bi 。
求在进行操作之后两个数组的权值之和最小能够达到多少。
= (a1+....an )^2 +(b1+...bn)^2 -(n-2)*(ai * ai + bi*bi )
前面的用dp做 f[i][j] | f[i-1][j- x ]
#include <iostream> #include <cmath> #include <algorithm> #include <cstring> using namespace std; const int N =1e4+3; int f[102][N],a[102],b[102],n; #define int long long int solve(){ int i,j,S=0; cin>>n; for(i=1;i<=n;i++)cin>>a[i],S+=a[i]; for(i=1;i<=n;i++)cin>>b[i],S+=b[i]; memset(f,0,sizeof f); f[0][0]=1; for(i=1;i<=n;i++) for(j=0;j<=S;j++){ if(j>=a[i]) f[i][j]|=f[i-1][j-a[i]]; if(j>=b[i]) f[i][j]|=f[i-1][j-b[i]]; } int ans=1e18; for(i=-0;i<=S;++i){ if(f[n][i]) ans=min(ans,i*i+(S-i)*(S-i)); } for(i=1;i<=n;i++){ ans+=(n-2)*(a[i]*a[i]+b[i]*b[i]); } cout<<ans<<endl; } signed main(){ int tes;cin>>tes; while(tes--){ solve(); } }
标签:CF1637D,Minimization,int,bi,ai,数组,102,Problem,include From: https://www.cnblogs.com/towboa/p/17156221.html