Race
Codeforces
题目分析
要使时间最短,且时间不超过X,即冲线速度应为X,运动过程为先加速到一定速度后减速到X;可以先特判一直加速的情况,得到最大冲线速度mv以及最短冲线时间mv(加速度为1);若X<mv,因为运动是先加速后减速,所以运动过程中至少有两次到达速度X。可先计算出从1加速至X运动路程以及以X冲线时的运动
路程。此时与总路程的差值可以看作是填补在两段路程中间,具体思路看代码。
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<iostream>
using namespace std;
int main()
{
int N,K;
int t;
scanf("%d%d",&K,&N);
int mv=1 ;//计算最大冲线速度
while((1+mv)*mv/2<K){
mv++;
}
int x;
while(N--)
{
scanf("%d",&x);
if(x >= mv )//若x>mv,则全程加速,时间为最短时间
{
printf("%d\n",mv);
}else{
if(K-x-(1+x)*x/2==0){//有可能冲线时为多跑了且当冲线速度为mv-1时也到达终点(题目的
//ending either at or past the goal line at this integer point in time)
printf("%d\n",x+1);
continue;
}
int rest=K-x-(1+x)*x/2;//还需要跑的路程
int cnt=1,sum=0,rec=x+1;//每加一秒中间可以填rec单位路程
while(1)
{
if(cnt%2==1){
sum+=rec;
}
if(cnt%2==0){
sum+=rec;
rec++;
}
if(rest<=sum)break;//剩余路程跑完
else cnt++;
}
int res=x+1+cnt;
printf("%d\n",res);
}
}
return 0;
}