广州大学第十四届ACM大学生竞赛 E - 注意风
注意风
https://ac.nowcoder.com/acm/contest/6241/E
3次操作一个周期,第一步判断是否能在一个周期能走完,简单模拟一下即可。
如果一个周期不能走完并且一个周期走的距离不是正数,说明无解。
如果不能在一个周期内走完,先把全长减去一个周期内能走的最长距离,剩下的部分看能走几个周期,这样做的目的是防止多计算一些路程(类似小学奥数题,蜗牛爬井)
最后把剩余的没走的部分模拟走一下就行,显然最多走两个周期。
参考代码:
#include <bits/stdc++.h> using namespace std; struct _IO{_IO(){ios::sync_with_stdio(0);cin.tie(0);}}_io; typedef long long ll; typedef long double db; const int N = 2e5 + 5, M = 1e9 + 7; int main() { cout << setprecision(10) << fixed; ll a, b, c, x, y, z, m; cin >> a >> b >> c >> x >> y >> z >> m; x = z - x, y = z + y; ll d1 = a * z, d2 = x * b, d3 = y * c; if (d1 >= m) { cout << (db) m / z; return 0; } if (d1 + d2 >= m) { cout << a + (db) (m - d1) / x; return 0; } if (d1 + d2 + d3 >= m) { cout << a + b + (db) (m - d1 - d2) / y; return 0; } if (d1 + d2 + d3 <= 0) { cout << "Badeline win"; return 0; } ll t = m - max(d1, d3 + d1 + d2); ll ans = t / (d1 + d2 + d3) * (a + b + c), r = t % (d1 + d2 + d3) + (m - t); if (d1 >= r) { cout << ans + (db) r / z; return 0; } r -= d1, ans += a; if (d2 >= r) { cout << ans + (db) r / x; return 0; } r -= d2, ans += b; if (d3 >= r) { cout << ans + (db) r / y; return 0; } r -= d3, ans += c; if (d1 >= r) { cout << ans + (db) r / z; return 0; } r -= d1, ans += a; if (d2 >= r) { cout << ans + (db) r / x; return 0; } r -= d2, ans += b; if (d3 >= r) { cout << ans + (db) r / y; return 0; } r -= d3, ans += c; }