有一个a数组,里面有n个整数。现在要从中找到两个数字(可以是同一个) ai,aj ,使得 ai mod aj 最大并且 ai ≥ aj 。
Input
单组测试数据。 第一行包含一个整数n,表示数组a的大小。(1 ≤ n ≤ 2*10^5) 第二行有n个用空格分开的整数ai (1 ≤ ai ≤ 10^6)。
Output
输出一个整数代表最大的mod值。
Input示例
3 3 4 5
Output示例
2
这个题没啥算法 思维题。可能是五级的一个水题吧。随便一写就过了。高看五级难度了。
所谓取余数 。其实就是大的数减去小的数一个小于等于大数的倍数。
因为 a[i]>a[j]
这就很明显了 。a【j】 的倍数一直在递增。
把递增的按照从小到大排序。
存起来。
之后 新的j减去最小的倍数就好 。
优先队列存贮。
#include <bits/stdc++.h>
using namespace std;
typedef pair<int ,int > pr;
#define mo 200005
pr a[mo];
struct pcmp//定义优先级小的优先
{
bool operator()(pr a,pr b)
{
return a.first>b.first;
}
};
bool cmp(pr a,pr b)
{
return a.second<b.second;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
priority_queue<pr,vector<pr >,pcmp> s;
int x;
for(int i=0;i<n;i++)
{
//cin>>x;
scanf("%d",&x);
a[i].first=x;
a[i].second=x;
}
sort(a,a+n,cmp);
int maxs=0;
pr t;
for(int i=0;i<n;i++)
{
while(1&&i)
{
t=s.top();
if(t.first+t.second>a[i].second)//取最大的有效值
{
maxs=max(maxs,a[i].second-t.first);
break;
}
while(t.first+t.second<=a[i].second)//把倍数循环到小于等于a[i].second.
t.first+=t.second;
s.pop();
s.push(t);
// cout<<t.first<<' '<<t.second<<endl;
}
s.push(a[i]);
}
//cout<<maxs<<endl;
printf("%d\n",maxs);
}
return 0;
}