CodeForces_485D_Maximum Value_思维
来源:互联网 发布:中国基尼系数知乎 编辑:程序博客网 时间:2024/05/16 01:43
题意
You are given a sequence a consisting of n integers. Find the maximum possible value of ai mod aj (integer remainder of ai divided by aj), where 1 ≤ i, j ≤ n and ai ≥ aj.
(1 ≤ n ≤ 2·105)(1 ≤ ai ≤ 106)
思路
当 aj * k < ai < aj * (k + 1) 时,ai mod aj 时随 ai 的增大而增大的。由此引出思路:k * aj,找出小于 k * aj 的最大的 ai,则 ai mod aj 为一个可能的答案。
**复杂度计算
对 aj 进行去重后,枚举 aj 的倍数的最坏复杂度为 n / 1 + n / 2 + n / 3 + n / 4 + … + n / n = nlogn。这一点需要注意。如果误认为时 n * n,那这个题就不会做了。实际上这里的 n 要取到 n * 2。因为 k * aj 可能需要大于 n。**
剩下的一个问题是,如何找小于 k * aj 的最大的 ai。二分的话,整体复杂的就是 n*logn * logn。似乎也没问题。观察到 ai 的范围不大,能开的下数组,就考虑预处理出小于 ai 的最大的 aj。这样整体复杂度就变成了 n * logn,稳过。
题目链接
http://codeforces.com/problemset/problem/485/D
AC代码
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxn = 2e5 + 10;const int maxm = 1e6 + 10;int n;int A[maxn];int B[maxm * 2];int main(){ scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", A + i); sort(A, A + n); n = unique(A, A + n) - A; for(int i = 0, j = A[0]+1; i < n; i++) { while(j <= A[i+1]) B[j++] = A[i]; } for(int j = A[n-1]+1; j < maxm * 2; j++) B[j] = A[n-1]; int res = 0; for(int i = 0; i < n; i++) { for(int j = 2; j * A[i] < 2 * maxm; j++) { int d = j * A[i]; if(B[d] % A[i] > res) res = B[d] % A[i]; } } printf("%d\n", res); return 0;}
阅读全文
0 0
- CodeForces_485D_Maximum Value_思维
- 思维
- 思维
- 思维
- 思维
- 思维
- 思维
- 【思维方式】思维转个弯
- 完整性思维--层次思维
- 不战而胜思维
- 思维图谱
- 思维定式
- 思维吊床
- 思维方式
- 思维分析
- 思维元素
- 思维混乱
- 骑马思维
- CenOS7下的Redis 主从配置
- Android初级开发(六)——2、文件存储数据
- 欧拉函数
- Java虚拟机体系结构,你知道吗?
- HDU 4609 3-idiots(FFT)
- CodeForces_485D_Maximum Value_思维
- FCC-----------Missing letters
- ubuntu下配置网络(IP、网关、DNS)
- android 六边形蜂巢布局控件
- JVM笔记
- Linux SUID位的作用
- 全局最短路径之弗洛伊德算法
- Ubuntu14.04-server下安装WDCP
- PropertyResolver