codeforce div1+2 621 B. Cow and Friend

codeforce div1+2 621 B. Cow and Friend_第1张图片
这道题大意是给定一些步伐,然后目标从0,0走到0,x问最少要几步,刚开始,我就想到了贪心,因为每两次最大的步伐就可以做到移动(0,2a【i】)的距离,所以我选择用数组存储所有小于2a【n】的值(a[n]为排序后最大值)然后把所有a[I]的答案更新为1,考虑余数加数组来解决问题
可是答案超时了。
之后重新看这个问题,发现了之前的一个误区,就比如3 4 5 凑13的例子我一直在考虑刚好满足3+5+5的情况,却忽略了一个很重要的情况那就是就算5只去奇数个,也可以灵活表示所有小于等于它的倍数的值,也就是说,不需要对情况进行过度细分只需用向上取整的方法随时与2比较保证ans可以达到即可,它的原理就在于向上取整即可表示所有答案因为等腰三角形的边固定时,底的范围可以从0到2*边长,很灵活,无需分解问题

代码也变得异常简单

#include 
using namespace std;
int main(){
	int T, N, x;
	for(cin >> T; T; T--){
		cin >> N >> x;
		int ans = 1e9+1, a;
		while(N--){
			cin >> a;
			ans = min(ans, max(2, (x+a-1) / a));
			if(a == x)
				ans = 1;
		}
		cout << ans << endl;
	}
}

你可能感兴趣的:(codeforce,贪心)