【贪心】选武器

http://oj.hzjingma.com/p/7817?view=classic

在这里插入图片描述
在这里插入图片描述
贪心的能力还是弱啊。
代码块:

const int N=1e5+10;
ll a[N],b[N],k;
int n;
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		read(a[i]),read(b[i]);
	}
	sort(a+1,a+n+1,greater<int>());
	sort(b+1,b+n+1,greater<int>());
	ll va=0,ans=1e18;
	if(b[1]>=k){
		puts("1");return 0;
	}
	for(int i=1;i<=n;i++){
		va+=b[i];
		if(va>=k){
			ans=min(ans,1ll*i);break;
		}else ans=min(ans,i+(ll)ceil((k-va)/1.0/a[1]));
	}
	cout<<ans<<endl;
	return 0;
}

如何贪?
选大的怎么选?
之前我一直纠结着同一个材料有两种不同的属性
这是关联着的,又怎么排,按照哪个来从大到小排起到决定作用么?

看了题解才发现
把数组a,数组b都从大到小排就好了。
遍历只能一次性使用的b数组,从大到小加起来,然后再每次都计算剩下的值可以被a[1]除几次,向上取整,再加上当前的i,更新ans。
虽然看起来都是之后再对a[1]进行操作,但是只要当做是之前操作的就好了。

发布了16 篇原创文章 · 获赞 0 · 访问量 90

猜你喜欢

转载自blog.csdn.net/weixin_44745441/article/details/104502721
今日推荐