广州大学第十四届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;
}
全部评论

相关推荐

03-10 14:19
已编辑
重庆邮电大学 前端工程师
球Offer上岸👑:测试也难求一面 逆天
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务