题意
Bessie 正在参加一场 K 米的跑步比赛。
她从 0 米每秒的速度开始比赛。
在每一秒中,她可以选择将她的速度增加 1 米每秒,保持速度不变,或者将她的速度减少 1 米每秒。
例如,在第一秒中,她可以将她的速度增加到 1 米每秒,跑 1 米,或者保持她的速度 0 米每秒不变,跑 0 米。
Bessie 的速度不会降低到小于零。
Bessie 始终朝着终点线的方向跑,她想要花费整数秒的时间完成比赛。
此外,她不想在终点时跑得太快:在 Bessie 跑完 K 米的时刻,她希望她的速度不超过 X 米每秒。
Bessie 想要对于 N 个不同的 X 值知道她多快可以完成比赛。
输入格式
输入的第一行包含两个整数 K 和 N。
以下 N 行每行包含一个整数 X。
输出格式
输出 N 行,每行包含一个整数,表示 Bessie 完成比赛时的速度小于或等于 X 的情况下跑完 K 米需要的最小时间。
数据范围
1≤K≤109,
1≤X≤105,
1≤N≤1000
样例
输入样例
10 5
1
2
3
4
5
输入样例
6
5
5
4
4
题解
这个题,我看到这个题的时候,我想到的贪心。我想的是尽可能大,当路程一半的时候,在减回来,但是这么做,还是有问题。局部最优,并不能全局最优。这题的模拟过程就OK了。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
inline int deal(int kk,int m){
int res=0,v=1,aa=0,sum=0;//定义的各种变量
while(1){//模拟的过程
res+=v;//路程累加
sum++;//时间累加
if(res+aa>=m) break;//当距离大于或者等于退出 循环
if(v>=kk){//关键的步骤,有点类似于对称函数,这样计算就会计算两次,但是不会影响答案,因为双方边界确定了,都是在V>=kk计算
sum++;
res+=v;
if(res+aa>=m) break;//防止多计算次数。
}
v++;
}
return sum;
}
signed main (){
int m,k;
cin>>m>>k;
for(int i=1;i<=k;i++){
int kk;
cin>>kk;
cout<<deal(kk,m)<<endl;//处理函数
}
return 0;
}
蟹蟹,欢迎指正