目录
一、木材加工

答案如下:
cpp
#include<iostream>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
int a[N];
int n,k;
int cal(int x)
{
int sum = 0;
for(int i = 1; i <= n; i++)
{
sum += a[i]/x;
}
return sum;
}
int main()
{
cin >> n >> k;
int left = 0, right = 1e8;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
}
while(left < right)
{
int mid = (left+right+1)/2;
if(cal(mid) >= k)
{
left = mid;
}
else{
right = mid-1;
}
}
cout << left << endl;
return 0;
}
二、EKO/砍树

答案如下:
cpp
#include<iostream>
using namespace std;
typedef long long LL;
const int N = 1e6+10;
LL a[N];
int n,m;
LL cal(LL x)
{
LL ret = 0;
for(int i = 1; i <= n; ++i)
{
if(x < a[i])
{
ret += a[i] - x;
}
}
return ret;
}
int main()
{
cin >> n >> m;
LL max = 0;
for(int i = 1; i <= n; ++i)
{
cin >> a[i];
if(a[i] > max)
{
max = a[i];
}
}
LL left = 0, right = max;
while(left < right)
{
LL mid = (left + right + 1)/2;
if(cal(mid) >= m)
{
left = mid;
}
else{
right = mid - 1;
}
}
cout << left << endl;
return 0;
}
三、跳石头

答案如下:
cpp
#include<iostream>
using namespace std;
const int N = 5e4 + 10;
int a[N];
int l,n,m;
int calc(int x)
{
int ret = 0;
for(int dst = 0, src = dst + 1; dst <= n; dst++)
{
while(src <= n && a[src] - a[dst] < x)
{
src++;
}
ret += src - dst - 1;
dst = src - 1;
}
return ret;
}
int main()
{
cin >> l >> n >> m;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
}
a[n+1] = l;
n++;
int left = 0, right = l;
while(left < right)
{
int mid = left + (right - left + 1)/2;
if(calc(mid) > m)
{
right = mid - 1;
}
else{
left = mid;
}
}
cout << left << endl;
return 0;
}