GDUT_排位赛题解报告_第3场_D. Race

探讨了Bessie在受速度限制下完成比赛的最优策略,通过模拟和数学分析,确定了不同最大允许速度下完成固定距离所需最短时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bessie is running a race of length K (1≤K≤109) meters. She starts running at a speed of 0 meters per second. In a given second, she can either increase her speed by 1 meter per second, keep it unchanged, or decrease it by 1 meter per second. For example, in the first second, she can increase her speed to 1 meter per second and run 1 meter, or keep it at 0 meters per second and run 0 meters. Bessie’s speed can never drop below zero.

Bessie will always run toward the finish line, and she wants to finish after an integer amount of seconds (ending either at or past the goal line at this integer point in time). Furthermore, she doesn’t want to be running too quickly at the finish line: at the instant in time when Bessie finishes running K meters, she wants the speed she has just been traveling to be no more than X (1≤X≤105) meters per second. Bessie wants to know how quickly she can finish the race for N (1≤N≤1000) different values of X.

Input
The first line will contain two integers K and N.

The next N lines each contain a single integer X.

Output
Output N lines, each containing a single integer for the minimum time Bessie needs to run K meters so that she finishes with a speed less than or equal to X.

Example
inputCopy
10 5
1
2
3
4
5
outputCopy
6
5
5
4
4
Note
When X=1, an optimal solution is:

Increase speed to 1 m/s, travel 1 meter Increase speed to 2 m/s, travel 2 meters, for a total of 3 meters Keep speed at 2 m/s, travel 5 meters total Keep speed at 2 m/s, travel 7 meters total Keep speed at 2 m/s, travel 9 meters total Decrease speed to 1 m/s, travel 10 meters total

When X=3, an optimal solution is:

Increase speed to 1 m/s, travel 1 meter Increase speed to 2 m/s, travel 3 meters total Increase speed to 3 m/s, travel 6 meters total Keep speed at 3 m/s, travel 9 meters total Keep speed at 3 m/s, travel 12 meters total

Note that the following is illegal when X=3:

Increase speed to 1 m/s, travel 1 meter Increase speed to 2 m/s, travel 3 meters total Increase speed to 3 m/s, travel 6 meters total Increase speed to 4 m/s, travel 10 meters total

This is because at the instant when Bessie has finished running 10 meters, her speed is 4 m/s.

这个题就是一个模拟:
就是在限制最终速度为x的情况下,要跑出的最长距离需要在比赛中途达到最快速度并马上放缓速度,而此时跑完固定距离所需要的时间也是最短的,根据这种思路开始模拟.

推式子的时候要小心不要推错,然后就是非常简单的代码实现,难在分类和数学上面。
然后就是完整代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <queue>
#include <stack>
#include <map>
//鬼畜头文件
using namespace std;
const int INF = 0x3f3f3f3f;
const int mod = 1e9+7;
typedef unsigned long long ULL;
typedef long long LL;
//鬼畜define
LL k,n,x;
LL all[100010];
int main()
{
	all[0]=0;
	for(int time=1;time<100010;time++)
	{
		all[time]=all[time-1]+(LL)time;
	}
	scanf("%lld %lld",&k,&n);
	for(int time=0;time<n;time++)
	{
		scanf("%lld",&x);
		LL mid;
		for(mid=1;1;mid++)
		{
			if(mid>=x&&mid+all[mid-1]*2>all[x-1]+k)break;
			if(mid<x&&all[mid]>k)break;
		}
		mid--;
 
		LL need=k+all[x-1]-mid-all[mid-1]*2;
		if(all[mid]==k&&mid<=x)printf("%lld\n",mid);
		else if(all[mid]<k&&mid+1<=x)printf("%lld\n",mid+1);
		else if(need==0)printf("%lld\n",mid*2-x);
		else if(need<=mid)printf("%lld\n",mid*2-x+1);
		else printf("%lld\n",mid*2-x+2);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值