Codeforces 346C Number Transformation II 贪心(复杂度计算)

题意及思路: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\n", ans);
} 

  

猜你喜欢

转载自www.cnblogs.com/pkgunboat/p/10966413.html
今日推荐