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 }
View Code

 

posted @ 2020-09-20 09:01  canwinfor  阅读(133)  评论(0)    收藏  举报