地址:https://www.acwing.com/problem/content/3998/
来源:AcWing,第20场周赛
给定两个长度为 n 的整数序列 a1,a2,…,an 和 b1,b2,…,bn。 现在要对序列 a 进行恰好 k1 次操作,对序列 b 进行恰好 k2 次操作。 每次操作具体流程为选取序列中的一个元素,并将其加 1 或减 1。 要求所有操作进行完毕以后,∑i=1n(ai−bi)2 尽可能小。 输入格式 第一行包含三个整数 n,k1,k2。 第二行包含 n 个整数 a1,a2,…,an。 第三行包含 n 个整数 b1,b2,…,bn。 输出格式 一个整数,表示所有操作进行完毕以后,∑i=1n(ai−bi)2 的最小可能值。 数据范围 前六个测试点满足,1≤n≤5。 所有测试点满足,1≤n≤103,0≤k1+k2≤103,k1 和 k2 都是非负整数,−106≤ai,bi≤106。 输入样例1: 2 0 0 1 2 2 3 输出样例1: 2 输入样例2: 2 1 0 1 2 2 2 输出样例2: 0 输入样例3: 2 5 7 3 4 14 4 输出样例3: 1
需要注意的点:
数据规模不大,可以试着用朴素做法。
数据范围较大,平方后会爆int,所以用long long
当剩余操作数不为0时,并且差值都为0后,奇数为1,偶数为0;
#include#include #include #include using namespace std; int main() { int n,k1,k2; cin>>n>>k1>>k2; long long int num[n],num1[n],num2[n]; for(int i=0;i >num[i]; for(int i=0;i >num1[i]; num2[i]=abs(num[i]-num1[i]); } int k=k1+k2; long long int sum=0; for(int i=0;i num2[t])//查找最大的数 t=j; } if(!num2[t])//如果所有数都为0 { sum=(k-i)%2; break; } num2[t]--; } for(int i=0;i



