My Solution
题意:从x1 出发到 x2,走路速度是t2 s/ 单位长度 ,坐车是t1 s/ 单位长度,车子在0~s间不断往返,此时车在p位置,且方向是d,(正向 d == 1,反向 d == -1) 问从x1到x2的最短时间
数学、讨论
此外题可以分成2大类,到达的时候是走路的则只考虑全走路,如果到达的时候是坐车则只考虑坐车,
即x1到达x2所花的时间为此时p位置到最后以x1指向x2的方向经过x2时的总时间。
具体分成如下6类讨论
当 x1 < x2 时
ans = (x2 - x1) * t2;
if(d == 1){
if(p <= x1){ //p 在 x1、 x2 左边边
ans = min(ans, (x2 - p) * t1);
}
else{
ans = min(ans, (s + x2 + s - p) * t1);
}
}
else{
ans = min(ans, (p + x2) * t1);
}
当 x1 > x2 时
ans = (x1 - x2) * t2;
if(d == 1){
ans = min(ans, (s - p + s - x2) * t1); //
}
else{
if(p >= x1){ //p 在 x1、 x2 右边
ans = min(ans, (p - x2) * t1);
}
else{
ans = min(ans, (p + s + s - x2) * t1);
}
}
#include
#include
using namespace std;
typedef long long LL;
const int maxn = 1e6 + 8;
int main()
{
#ifdef LOCAL
freopen("c.txt", "r", stdin);
//freopen("c.out", "w", stdout);
int T = 4;
while(T--){
#endif // LOCAL
ios::sync_with_stdio(false); cin.tie(0);
LL s, x1, x2, t1, t2, p, d, ans = 9e18;
cin >> s >> x1 >> x2;
cin >> t1 >> t2;
cin >> p >> d;
if(x1 < x2){
ans = (x2 - x1) * t2;
if(d == 1){
if(p <= x1){ ans = min(ans, (x2 - p) * t1); } else{ ans = min(ans, (s + x2 + s - p) * t1); } } else{ ans = min(ans, (p + x2) * t1); } } else{ ans = (x1 - x2) * t2; if(d == 1){ ans = min(ans, (s - p + s - x2) * t1); //(©Ð£ß©Ð) } else{ if(p >= x1){
ans = min(ans, (p - x2) * t1);
}
else{
ans = min(ans, (p + s + s - x2) * t1);
}
}
}
cout << ans << endl;
#ifdef LOCAL
cout << endl;
}
#endif ** LOCAL
return 0;
}
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/
Thank you!
------from ProLightsfx
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/codeforces-round-386-div-2-c-tram/
共有 0 条评论