专栏文章
题解:AT_abc416_d [ABC416D] Match, Mod, Minimize 2
AT_abc416_d题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miopmx1z
- 此快照首次捕获于
- 2025/12/02 23:05 3 个月前
- 此快照最后确认于
- 2025/12/02 23:05 3 个月前
题面大意
给定两个长度都为 的数组 和一个整数 ,让你重新排列 ,使得 最小,并输出这个数。
其中 , 且 和 中的每个元素都小于 。
( 次多测,)
思路
根据 和 中的每个元素都小于 这个条件可以推出 是小于 的。
所以在模 的时候,每次 都会有两种情况:
第一种: 跟直接加没区别。
第二种: 这样便会在之前的答案上减掉一个 。
可以很清楚的发现,第二种是完全优于第一种的,所以我们要尽可能多的产生第二种。
贪心的考虑,给每个 配最小能使得和大于等于 的 ,最后剩实在配不了的。
将两个数组排个序,因为有单调性了所以后面可以直接双指针做。
AC CODE:
CPP#include<bits/stdc++.h>
using namespace std;
long long _,n,m,a[300005],b[300005],ans;
inline bool cmp(long long x,long long y){
return x>y;
}
int main(){
scanf("%lld",&_);
while(_--){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++){
scanf("%lld",&b[i]);
}
sort(a+1,a+n+1);
sort(b+1,b+n+1,cmp);
long long tp=1;
ans=0;
for(int i=1;i<=n;i++){
while(b[i]+a[tp]<m && tp<=n)tp++;
if(tp==n+1)break;
ans+=(b[i]+a[tp])%m;
b[i]=a[tp]=0;
tp++;
}
for(int i=1;i<=n;i++){
ans+=a[i]+b[i];
}
printf("%lld\n",ans);
}
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...