5106: [CodePlus2017]汀博尔
题目:传送门
题解:
百题纪念!!!
原谅一下第一百题刷了到水题...
直接二分月份然后判断(注意上界大小)
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 typedef long long LL; 8 int n; 9 LL h[210000],a[210000],s,t,L; 10 bool check(LL x) 11 { 12 LL sum=0; 13 for(int i=1;i<=n;i++) 14 if(h[i]+a[i]*x>=L) 15 sum+=h[i]+a[i]*x; 16 if(sum>=s)return true; 17 return false; 18 } 19 int main() 20 { 21 scanf("%d%lld%lld",&n,&s,&L);for(int i=1;i<=n;i++)scanf("%lld",&h[i]); 22 LL maxx=0;for(int i=1;i<=n;i++)scanf("%lld",&a[i]),maxx=max(maxx,a[i]); 23 LL l=0,r=1+max(s,L)/maxx,mid,ans; 24 while(l<=r) 25 { 26 mid=(l+r)/2; 27 if(check(mid)==true) 28 { 29 ans=mid; 30 r=mid-1; 31 } 32 else l=mid+1; 33 } 34 printf("%lld ",ans); 35 return 0; 36 }