[题目]大意
有 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∗(mid−1)
然后
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
tot≥sum
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;
}