长安大学 迎新赛 圣诞节分糖果问题
做法,我们将所有值先取余一下p, 最后的得到的值,分为了两部分,a+b相加都大于等于p,相加一定小于p
分别求出这两部分的最大值,然后进行比较大小. 可以确定地是 1.大于等于p的部分随着两个糖果数的增大,答案也会增大 因为ans=p-(t1+t2) t1=a1%p,t2=a2%p a1,a2取不大于p的最大值,那么t1,t2得到的就是最小值,最后得到的大于等于p部分的ans得到的 就是最大值。 第二部分a1,a2相加的结果总是小于p的部分我们通过a[l]+a[r]<p中得到满足条件的最大值。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,p;
cin>>n>>p;
for(int i=0;i<n;i++){
int x;
cin>>x;
a[i]=x%p;
}
sort(a,a+n);
int ans=(a[n-2]+a[n-1])%p;//开始值为>=p的部分最大的值,他一定是最大的。
int l=0,r=n-1;
while(l<r){
while(a[l]+a[r]>=p) r--;//把范围缩小相加<p的部分
if(l<r){
ans=max(ans,a[l]+a[r]);
l++;//增大a1看看是否会得到更大的值
}
}
cout<<ans<<endl;
}
return 0;
}