ZOJ - 4062 E - Plants vs. Zombies ###K ###K ###K //K
题目链接:https://zoj.pintia.cn/problem-sets/91827364500/problems/91827370312
题意:每个植物有一个生长速度a[i] 有一个机器人开始在0的位置,机器人可以最多走m步 每到一个位置可以让植物的繁荣加上他的生长速度,问所有植物中的最小值 最大可能为多少
思路:求最小值的最大值 二分check 得到了每个植物要浇水的次数后 每次来回往前跑是最优的
这道题 二分很好想 但是主要是要考虑细节
到n之前每次都一定要向前走 然后再特判最后一个位置 要不要走上去
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define pb push_back 5 const int maxn =1e5+10; 6 const int mod=1e9+7; 7 ll a[maxn]; 8 ll b[maxn]; 9 ll n,m; 10 int check(ll x) 11 { 12 ll sum=0; 13 for(int i=1;i<=n;i++) 14 { 15 b[i]=(x+a[i]-1)/a[i]; 16 //b[i]=ceil(x/(double)a[i]); 17 } 18 19 for(int i=1;i<n;i++) 20 { 21 sum++; 22 b[i]--; 23 if(b[i]<=0) 24 continue; 25 sum+=b[i]*2; 26 b[i+1]-=b[i]; 27 /* if(sum>m) 28 return 0; //如果r的范围初始化太大需要这个 否则爆ll*/ 29 } 30 if(b[n]>0) 31 { 32 sum++; 33 b[n]--; 34 sum+=b[n]*2; 35 } 36 if(sum<=m) 37 return 1; 38 return 0; 39 } 40 41 42 43 int main() 44 { 45 ios::sync_with_stdio(false); 46 cin.tie(0); 47 int t; 48 cin>>t; 49 while(t--) 50 { 51 cin>>n>>m; 52 for(int i=1;i<=n;i++) 53 { 54 cin>>a[i]; 55 56 } 57 ll l=0,r=1e13; 58 ll ans=0; 59 while(l<=r) 60 { 61 ll mid=(l+r)/2; 62 if(check(mid)) 63 { 64 l=mid+1; 65 ans=mid; 66 } 67 else 68 r=mid-1; 69 } 70 cout<<ans<<'\n'; 71 } 72 73 74 75 76 77 78 79 80 81 }

浙公网安备 33010602011771号