【二分答案】SDUT 3916 上色的纱雾

Problem Description

输入n,m分别代表,n代表需要上色的n个点的一维下标,m代表你当前拥有的画笔数量。问你把所有点画完最少需要的时间,画笔同时移动一个单位需要一秒。

Example Input

3 2
1 4 8
3 1
1 2 9
4 2
1 2 3 6

Example Output

3
8
2

Hint

两支画笔,第一支画笔初始地点选择 1,第二支画笔初始地点选择地点 8。
那么 3s 后第一支画笔可以到达地点 4,这样 3 个点就可以全部涂上了。

代码:二分枚举答案,不断更新最小答案

#include<bits/stdc++.h>
using namespace std;
int a[100055], n, m;
int judge(int ans)//判断该答案是否满足要求
{
    int make = a[0] + ans, num = 1;//假设一笔画ans长度
    for(int i = 0; i < n; i++)
    {
        if(make < a[i])
        {
            num++;//多加一笔
            make = a[i] + ans;//更新当前能画的最远距离
        }
    }
    return num <= m;//满足返回1,否则0
}
void solve()
{
    int l = 0, r = 1000000000, ans;
    for(int i=0; i<150; i++)//枚举次数的差不多边界情况。也可以while(l <= r)
    {
        int mid = (l + r) / 2;
        if(judge(mid))//满足
        {
            ans = mid;//更新答案
            r = mid-1;//减小画的长度
        }
        else l = mid + 1;//增加画的长度
    }
    printf("%d\n", ans);//退出循环,输出答案
}
int main()
{
    while(~scanf("%d %d", &n, &m))
    {
        for(int i = 0; i < n; i++)
            scanf("%d", &a[i]);
            sort(a, a +n);//从小到大排序
        solve();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值