首页 > 代码库 > Codeforces Round #276 (Div. 1)Maximum Value
Codeforces Round #276 (Div. 1)Maximum Value
题意很好理解,就是让你搞到两个数a[i],a[j]使得a[i]>a[j]且a[i]%a[j]最大,然后把最大值输出来.
然后,我就开始乱搞了,时间复杂度有点高,O(n*sqrt(max(a[i]));
很容易得出一个结论 如果a[i]>a[j]且a[i]/p==a[j]/p那么a[j]%p>a[j]%p.
那么就开始乱搞了枚举p,如果全部枚举了复杂度就变成O(n*max(a[i]))了.
我们可以只枚举p*p<a[i]的部分,剩下的肯定是连续的1.2.3.4...p.语文不好,不知道这么讲,总之枚举sqrt(a[i])就行了.
#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#define N 200000using namespace std;int a[N+20],ans,b[N+20];int main(){ int m; scanf("%d",&m); for (int i=1;i<=m;i++) scanf("%d",&b[i]); sort(b+1,b+1+m); int n = 0; for (int i=1;i<=m;i++){ if (b[i]!=b[i-1]) a[++n] = b[i]; } ans = 0; for (int j=1;j<=1000;j++){ int lef = n, rig = n - 1; for (int i=n;i>=1;i--){ if (j*j>a[i]) break; for (;a[lef-1]*(j+1)>a[i];lef--); if (lef<=rig&&a[i]%a[lef]>ans) ans = a[i]%a[lef