求助大佬帮忙 菜鸡只过了三个点 TAT
查看原帖
求助大佬帮忙 菜鸡只过了三个点 TAT
347979
wyzhf楼主2021/1/3 21:50
//求助大佬,菜鸡我还不会二分
//直接看代码,注释已写好
//只过了最后三个点
//可能是check函数的ans计数错了,也可能二分边界问题
//大佬们TAT帮帮我谢谢啦
#include<iostream>
#include <iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<string>
#include <stack>
#include<vector>
#define Debug(in) cout<<#in<<"="<<(in)<<endl
#define mm(a,x) memset(a,x,sizeof(a))
#define sync std::ios::sync_with_stdio(false);std::cin.tie(0)
#define endl '\n'
#define PI acos(-1.0)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int inf=0x3f3f3f3f;
ll d,n,m;string s;
ll a[100010], b[10010];bool flag;
bool check(ll x)//check函数
{
    ll i=0,tmp=0,ans=0;//i是移动的,tmp是记录的,ans计数
    while(i<=n+1)//从(0-(n+1))
    {
        i++;
        if(a[i]-a[tmp]<x)//如果小于最大距离
        {
            ans++;//计数加一(可以把石子移走)
        }
        else
        {
            tmp=i;//如果不行那就记录以下位置,继续
        }

    }
    return ans<=m;//返回的是符合范围的
}
int main()
{
    cin>>d>>n>>m;ll ans=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];//输入一下石子
    }
    a[0]=0,a[n+1]=d;//头和尾
    ll l=0,r=d;//左右边界
    while(l<r)//开始二分了,这个地方有点晕乎晕乎
    {
        ll mid=(l+r+1)>>1;
        if(check(mid))
            l=mid;
        else
            r=mid-1;
    }
    cout<<r;//输出
    return 0;

}
2021/1/3 21:50
加载中...