题意及思路:https://www.cnblogs.com/liuzhanshan/p/6560499.html
这个做法的复杂度看似是O(n ^ 2),实际上均摊是O(n)的。我们考虑两种极端数据:一种是全是2,那么去重后实际上只有一个数。这样是O(n)的。另一种是所有的数都不一样,那么为了让最大的那个最小,数分别为2, 3 ...1e5, 1e5 + 1, 但是a和b之差最多只有1e6,这种情况甚至比刚才那种耗时更少。故复杂度均摊是O(n)的。
代码:
#include <bits/stdc++.h> using namespace std; int n, a, b; const int maxn = 100010; int c[maxn]; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &c[i]); } scanf("%d%d", &a, &b); sort(c + 1, c + 1 + n); n = unique(c + 1, c + 1 + n) - (c + 1); int ans = 0; while(a > b) { int mi = a - 1; for (int i = 1; i <= n; i++) { if(a - a % c[i] >= b) mi = min(mi, a - a % c[i]); } ans++; a = mi; while(n >= 1 && a - a % c[n] < b)n--; } printf("%d ", ans); }