YBTOJ:喂养宠物

[题目]大意

\(n\)只兔兔,每只兔兔单独时都需要吃\(hunger_i\)的食物量,假如有同食者,那么每个同食者会让它需要多吃\(greed_i\)的食物量。假如小明最多能提供\(totalFood\)的食物,那么他最多能养多少只兔兔。

题目分析

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

\(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;
}
posted @ 2021-08-08 16:33  ssl_lhj  阅读(88)  评论(0)    收藏  举报