YBTOJ:喂养宠物

该博客介绍了如何运用二分搜索和贪心策略解决一个关于养兔的问题。给定每只兔子的食物需求和同食时额外的食物需求,以及总的食品供应量,目标是确定最多可以养多少只兔子。博主通过预处理每只兔子的食物代价,排序后累计计算前mid只兔子的食物需求,并用二分搜索来确定最大数量。最终,博主提供了C++代码实现这一算法。
摘要由CSDN通过智能技术生成

[题目]大意

n n n只兔兔,每只兔兔单独时都需要吃 h u n g e r i hunger_i hungeri的食物量,假如有同食者,那么每个同食者会让它需要多吃 g r e e d i greed_i greedi的食物量。假如小明最多能提供 t o t a l F o o d totalFood totalFood的食物,那么他最多能养多少只兔兔。

题目分析

养的兔子越多,所需食物量越大,可见答案具有单调性,用二分答案做。
答案的上下限:
下限很明显就是 0 0 0,上限就是兔兔的总数即 n n n n n n的最大值是 50 50 50,所以上限为 50 50 50
再确定二分条件:
“在养mid只兔兔时小明是否能够提供足够食物”。
怎么判断呢?
每个兔兔的代价是不同的,但是它们的贡献是相同的,所以可以用贪心做,先预处理出所有兔兔的代价,当选 m i d mid mid只兔兔时,第 i i i只兔兔的代价为 h u n g e r i + g r e e d i ∗ ( m i d − 1 ) hunger_i+greed_i*(mid-1) hungeri+greedi(mid1)
然后 s o r t sort sort大法~~
然后用 s u m sum sum累加前 m i d mid mid个,最后判断 t o t ≥ s u m tot \geq sum totsum

C o d e Code Code

#include<algorithm>
#include<iostream>
#include<cstdio>
#define sco 50
using namespace std;
int n,tot,l=0,r=50,mid,hun[sco],gre[sco];
bool check(int x){
	int p[sco]={},tmp=tot;
	for(int i=1;i<=n;++i){
		p[i]=hun[i]+gre[i]*(x-1);
	}sort(p+1,p+1+n);
	for(int i=1;i<=x;++i)tmp-=p[i];
	return tmp>=0;
}
int main(){
	scanf("%d%d",&n,&tot);
	for(int i=1;i<=n;++i)scanf("%d",hun+i);
	for(int i=1;i<=n;++i)scanf("%d",gre+i);
	while(l+1<r){
		mid=(l+r)/2;
		if(check(mid)) l=mid;else r=mid;
	}
	printf("%d",l);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值