AcWing 1934. 贝茜放慢脚步(代码有详细注释)
原题链接
简单
作者:
来不及了
,
2022-02-28 19:19:29
,
所有人可见
,
阅读 97
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;
const int target = 1000;
vector<int> T,D;
int n;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
char op;
int x;
cin>>op>>x;
if(op == 'T') T.push_back(x);
else D.push_back(x);
}
sort(T.begin(),T.end());
sort(D.begin(),D.end());
double v = 1,cnt = 1,s = 0,t = 0;
int i=0,j=0;
while(i<T.size()&&j<D.size())
{
double tmp = (D[j]-s) / v; //计算如果以当前速度从s点走到D[j]点需要花费的时间
if(t + tmp > T[i])
{
//说明我从S点到D[j]点中间需要经过一次减速,假设走到x点就会减速
cnt++;
tmp = T[i] - t; //从t~tmp这段时间是以速度v进行
t = T[i];//当前已经用时为这个
s += (tmp*v); //更新当前已经走过的距离
//到达T[i]之后要经历一次减速
v = 1/cnt;
i++;
}
else if(t + tmp == T[i])
{
cnt+=2;
//说明从起点到D[j]点花费的时间为T[i],此时会进行两次减速
t = T[i];
s = D[j];
v = 1/cnt;
i++;
j++;
}
else
{
cnt++;
//说明减速发生在T[i]之前
t+=tmp;
s = D[j];
v = 1/cnt;
j++;
}
}
while(i<T.size())
{
//说明从此刻开始,后面每一次T[i]都会进行减速
cnt++;
double tmp = T[i] - t; //到下一个T[i]还有多久
s+=(tmp*v);
t = T[i];
v = 1/cnt;
i++;
}
while(j<D.size())
{
//说明从此刻开始,后面每一次D[j]都会进行减速
cnt++;
double tmp = (D[j]-s)/v;
t+=tmp;
s=D[j];
v = 1/cnt;
j++;
}
double rest = target - s; //还有这么远的距离才会到达
t+=(rest/v);
int res = round(t); //四舍五入 ,cell是向上取整,Floor是向下取整
cout<<res<<endl;
return 0;
}