二分答案练习
一、愤怒的羊驼
题目描述
输入描述
输出描述
样例1
提示
参考答案
#include <iostream>
#include <algorithm>
using namespace std;
int N, C;
int mid;
int pos[100005];
bool check(int mid)
{
int cnt = 1;
int prev = pos[1];
for (int i = 2; i <= N; i++)
{
if (pos[i]-prev >= mid)
{
cnt++;
prev = pos[i];
}
}
return (cnt >= C);
}
int main()
{
cin >> N >> C;
for (int i = 1; i <= N; i++)
{
cin >> pos[i];
}
sort(pos+1, pos+N+1);
int l = 1;
int r = pos[N] - pos[1];
int ans = 0;
while (l <= r)
{
mid = (l+r) / 2;
if (check(mid))
{
ans = mid;
l = mid+1;
}
else
{
r = mid-1;
}
}
cout << ans;
return 0;
}
二、偷吃西瓜
题目描述
输入描述
输出描述
样例1
提示
参考答案
#include <iostream>
using namespace std;
int N, H;
int ans;
int a[1000005];
bool check(int mid)
{
long long t = 0;
for (int i = 1; i <= N; i++)
{
t += (a[i]+mid-1)/mid;
}
return (t <= H);
}
int main()
{
cin >> N >> H;
for (int i = 1; i <= N; i++)
{
cin >> a[i];
ans = max(ans, a[i]);
}
int l = 1, r = ans;
while (l <= r)
{
int mid = (l+r) / 2;
if (check(mid))
{
ans = mid;
r = mid-1;
}
else
{
l = mid+1;
}
}
cout << ans;
return 0;
}
三、丢沙包
题目描述
输入描述
输出描述
样例1
提示
参考答案
#include <iostream>
#include <algorithm>
using namespace std;
int n, c;
int pos[100005];
bool check(int mid)
{
int prev = pos[1];
int cnt = 1;
for (int i = 2; i <= n; i++)
{
if (pos[i] - prev >= mid)
{
cnt++;
prev = pos[i];
}
}
return (cnt >= c);
}
int main()
{
cin >> n >> c;
for (int i = 1; i <= n; i++)
{
cin >> pos[i];
}
sort(pos+1, pos+n+1);
int mid, ans = 0;
int l = 1, r = pos[n]-pos[1];
while (l <= r)
{
mid = (l+r) / 2;
if (check(mid))
{
ans = mid;
l = mid+1;
}
else
{
r = mid-1;
}
}
cout << ans;
return 0;
}
四、木材加工
题目描述
输入描述
输出描述
样例1
提示
参考答案
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, k;
int len[100005];
bool check(int mid)
{
int cnt = 0;
for (int i = 1; i <= n; i++)
{
cnt += len[i]/mid;
}
return (cnt >= k);
}
int main()
{
freopen("wood.in", "r", stdin);
freopen("wood.out", "w", stdout);
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> len[i];
}
sort(len+1, len+n+1);
int mid, ans;
int l = 1, r = len[n];
while (l <= r)
{
mid = (l+r) / 2;
if (check(mid))
{
ans = mid;
l = mid+1;
}
else
{
r = mid-1;
}
}
cout << ans;
fclose(stdin);
fclose(stdout);
return 0;
}
五、路标设置
题目描述
输入描述
输出描述
样例1
提示
参考答案
#include <iostream>
using namespace std;
int ans;
int maxn;
int l, n, k;
int a[100005];
int check(int mid)
{
int cnt = 0;
for (int i = 2; i <= n; i++)
{
int tmp = a[i]-a[i-1];
while (tmp > mid)
{
tmp -= mid;
cnt++;
}
}
return (cnt <= k);
}
int main()
{
cin >> l >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
maxn = max(maxn, a[i]-a[i-1]);
}
int mid;
int l = 1, r = maxn;
while (l <= r)
{
mid = (l+r) / 2;
if (check(mid))
{
ans = mid;
r = mid-1;
}
else
{
l = mid+1;
}
}
cout << ans;
return 0;
}