二分答案练习
 
  
 
 
一、愤怒的羊驼
 
题目描述
 
 
输入描述
 
 
输出描述
 
 
样例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;
}