P1873 [COCI 2011/2012 #5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
int q[N];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int highest = 0;
int n, m; cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> q[i];
highest = max(q[i], highest);
}
int res = 0;//记录答案
int sum = 0;//记录当前砍了多少树的总高度
for (int i = 1; i <= highest; i++)//i:锯片高度
{
sum = 0;
for (int j = 1; j <= n; j++)//j:每一棵树
{
sum += max(0, q[j] - i);
//q[j] - i记录砍了这个树的长度 如果q[j] - i < 0则返回0 即砍不到这棵树了
if (sum >= m)
{
res = max(res, i);
continue;
//这个是记录锯片在符合获得长度(sum)超过需要长度(m)
//所需的最小值
}
}
}
cout << res;
return 0;
}
提交这份代码后我们会发现
哎,怎么超时了?这是因为我们使用的是朴素算法,运算程度大。那么我们要怎么优化呢?当然是用二分来优化!即不同于二分查找的方法:二分答案!
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
long long m,n;
int q[N];
bool check(int x)
{
long long sum = 0;
for (int i = 1; i <= n; i++)
{
sum += max(0, q[i] - x);
}
if (sum >= m)//记录当前砍了多少树的总高度>=m:需求的长度
{
return true;
}
else
{
return false;
}
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int highest = 0;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> q[i];
highest = max(q[i], highest);
}
long long res = 0;//记录答案
long long sum = 0;//记录当前砍了多少树的总高度
long long l = -1, r = highest;//这里的l和r是锯片的高度
while (l + 1 != r)
{
int mid = (l + r) / 2;
if (check(mid))
{
l = mid;
}
else
{
r = mid;
}
}
if (check(r))
{
cout << r;
}
else
{
cout << l;
}
return 0;
}
最后通过