植物大战僵尸【二分答案, 加贪心思想】
由于本题得数据范围大,所以不能去一个去枚举
用到二分答案,考虑当前得这个植物要它大大于等于mid, 所以就相当于来回跳,
跳的同时它得下以个植物防御也在增加。所以tempn = temp – 1(if它每满足大与等于mid)。满足就只有temp= 1,它到这里用得一天, 而并每有到下一个植物所以tempn = 0;统计天数,比较。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 typedef long long LL; 7 LL n, m; 8 vector<LL> a; 9 bool check(LL mid){ 10 11 LL temp = 0, tempn = 0, sum = 0; 12 for(int i = 0; i < n; ++ i){ 13 if(mid % a[i]) temp = mid / a[i] + 1; 14 else temp = mid / a[i]; 15 temp -= tempn; 16 if(temp <= 0){ 17 if(i != n-1) 18 temp = 1; 19 else temp = 0; 20 tempn = 0; 21 } 22 else{ 23 tempn = temp - 1; 24 } 25 sum += temp + tempn; 26 if(sum > m) 27 return false; 28 } 29 return true; 30 } 31 32 int main(){ 33 34 35 cin >> n >> m; 36 37 for (int i = 0; i < n; ++ i){ 38 LL p; 39 cin >> p; 40 a.push_back(p); 41 } 42 LL l = 0, r = 1e18; 43 while(l <= r){ 44 LL mid = (l + r) >> 1; 45 if(check(mid)){ 46 l = mid + 1; 47 } 48 else { 49 r = mid - 1; 50 } 51 } 52 cout << l - 1 << endl; 53 return 0; 54 }