题意:给定一些数字,求在 情况下, % 的最大值。
题解:先将数字排序,然后枚举每个数的k倍,
,然后二分搜索小于k倍当前数字的最大值,然后记录最大值输出就好了。
不过我的二分在边界判断时候出错了,我写的l
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int num[200005],n;
int main()
{
while(~scanf("%d",&n))
{
memset(num,0,sizeof num);
for (int i = 1; i <= n; i++)
{
scanf("%d",&num[i]);
}
sort(num + 1,num + n + 1);
int ans = 0;
for (int i = 1; i < n; i++)
{
if(num[i] < ans || num[i] == 0 || num[i] == num[i - 1])continue;
int tmp = 2 * num[i];
while(tmp <= num[n])
{
int l = i,r = n,mid = i;
while(l <= r)
{
mid = (l + r) >> 1;
if(num[mid] > tmp)
{
r = mid - 1;
}
else if(num[mid] == tmp)
{
r = mid - 1;
break;
}
else l = mid + 1;
}
ans = max(ans,num[r] % num[i]);
tmp += num[i];
}
ans = max(ans,num[n] % num[i]);
}
printf("%d\n",ans);
}
}