题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=5265
题目大意:A从n个数中选一个数,B从n-1个数中选一个,两者之和对p余数的最大值
题目评价:对现在的我来说不容易思考,听大神说二分是最佳方法,结果没编出来,还是用这种缩小夹值的笨方法了。
代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#define maxn 100005
using namespace std;
int map[maxn];
int main()
{
int n,p;
while(cin>>n>>p)
{
for(int i=0;i<n;i++)
{
int temp;cin>>temp;
if(temp>p)temp=temp%p;
map[i]=temp;
}
sort(map,map+n);
if(p-map[n-1]>map[n-2])cout<<map[n-1]+map[n-2]<<endl;
else
{
int temp=0;
int ans=map[n-1]+map[n-2]-p;
if(ans<0) ans=ans+p;
for(int i=n-1;i>=1;i--)
{
for(int j=temp;j<i;j++)
{
if(p-map[i]>map[j])ans=max((map[i]+map[j])%p,ans);
else{if(j>0){temp=j-1;}break;}
if(ans==p-1)break;
}
if(ans==p-1)break;
}
cout<<ans<<endl;
}
}
return 0;
}