P1873 倍增答案题解
leiwenjin1234 · · 题解
P1873 [COCI 2011/2012 #5] EKO / 砍树(倍增答案)
题意分析
有
思路分析
如果已知
倍增答案
核心代码
long long mid=0;//答案指针
for(long long i=20; i>=0; i--) { //由大到小保证凑出答案(答案范围设为2^20 ~ 0)
mid+=1<<i;//2^i
if(check(mid))mid-=1<<i;//发现木头不足要退回
}
我们知道,任意一个正整数均可拆分为多个
ACcode
#include<bits/stdc++.h>
using namespace std;
long long a[1000006];
long long n, m;
bool check(int mid) {
long long ans = 0;
ans = 0;
for (int i = 0; i < n; i++) {
if (a[i] > mid) ans += (a[i] - mid);//常规判断,注意树一定先要高于mid
}
return ans<m;//不能取等,因为等于也满足条件,不用退回
}
int main() {
cin >> n >> m;
for (long long i = 0; i < n; i++) {
cin >> a[i];
}
long long mid=0;//答案指针
for(long long i=20; i>=0; i--) { //由大到小保证凑出答案(答案范围设为2^20 ~ 0)
mid+=1<<i;//2^i
if(check(mid))mid-=1<<i;//发现木头不足要退回
}
cout << mid << endl;
return 0;
}