题目:Race
题目链接:https://codeforces.ml/group/5yyKg9gx7m/contest/270203/problem/D
题目描述:
初速度为0,每秒可以选择+1,保持和+1速度。
求在到终点速度最多x。求最短时间,向上取整。
题目分析:
用二分法。
求时间内最远距离,是否到达终点。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
long long a[200005];
int main()
{
long long n,k,p,x,q,mid,i;
scanf("%lld%lld",&k,&n);
for(i=1;i<=2e5;i++) a[i]=i+a[i-1]; //求an=n;的前缀和方便利用
while(n--)
{
scanf("%lld",&x);
if(a[x]>=k) //当最终速度不到x时
{
p=x;
q=0;
while(p-q!=1)
{
mid=(p+q)/2;
if(a[mid]>=k) p=mid;
else q=mid;
}
printf("%lld\n",p);
}
else //起码到x时
{
q=0;
p=1e5;
while(p-q!=1)
{
mid=(p+q)/2;
if(mid%2) //拱桥速度图求位移
{
if(a[x+mid/2]-a[x-1]+a[x+mid/2]>=k) p=mid;
else q=mid;
}
else
{
if(a[x+mid/2]-a[x-1]+a[x+mid/2-1]>=k) p=mid;
else q=mid;
}
}
printf("%lld\n",p+x);
}
}
return 0;
}