已解决
[补题记录] Atcoder Beginner Contest 319(E)
来自网友在路上 184884提问 提问时间:2023-09-19 15:21:36阅读次数: 84
最佳答案 问答题库848位专家为你答疑解惑
URL:https://atcoder.jp/contests/abc319
目录
E
Problem/题意
Thought/思路
Code/代码
E
Problem/题意
有 N 个公交站,给出前 N - 1 个公交站的发车时间 Pi 和到下一站需要的时间 Ti。给出 Q 次询问,每次给出从家的出发时间 Qi,问从第一站到最后一站要多少时间。
每个站的发车时间是 Pi 的倍数,从家到第 1 个站需要 X 时间,从第 N 个站到另一个家要 Y 时间。
Thought/思路
注意到 Pi 的范围是 [1, 8],假设 现在有 P1 = 2、P2 = 3,那么当 nowTime = 6 时,这两个站就会同时发车,然后每 6 时间,就会同时发车。
显然,对于所有的站台,他们的最小公倍数,就是同时发车时间,也意味着一个新的循环开始。
而 [1, 8] 的最小公倍数是 840,所以,我们只需要设 0~839 为每一种在第一个站台开始等待的情况,对每一种情况做一次模拟,最后询问时就可以直接获得答案。
Code/代码
#include "bits/stdc++.h"#define int long longint n, x, y;signed main() {std::cin >> n >> x >> y;std::vector <std::pair <int, int>> bt(n);for (int i = 1; i <= n - 1; ++ i) {int p, t; std::cin >> p >> t;bt[i] = {p, t};}std::vector <int> dp(840); // 840 == 0for (int i = 0; i <= 839; ++ i) {int now = i; // 在时间 i 从第 1 个站台出发for (int j = 1; j <= n - 1; ++ j) {int p = bt[j].first, t = bt[j].second;int wait = (p - now % p) % p; // p - now % p == pnow += wait + t;}dp[i] = now - i;}int t; std::cin >> t;while (t --) {int q; std::cin >> q;int i = (q + x) % 840;std::cout << q + x + dp[i] + y << "\n";}return 0;
}
查看全文
99%的人还看了
相似问题
- 时态图根据时间轴动态播放热力图
- 微信小程序发货信息录入接口 错误上传时间非法,请按照 RFC 3339 格式填写?
- 时间序列预测实战(十七)PyTorch实现LSTM-GRU模型长期预测并可视化结果(附代码+数据集+详细讲解)
- 设置指定时间之前的时间不可选
- C#关于TimeSpan结构的使用和获取两个时间差
- c++ 获取当前时间(精确至秒、毫秒和微妙)
- ChatGpt3.5已经应用了一段时间,分享一些自己的使用心得.
- java 统计代码运行时间
- 个人博客添加访问人数以及访问时间-githubpage
- 多维时序 | MATLAB实现PSO-BiGRU-Attention粒子群优化双向门控循环单元融合注意力机制的多变量时间序列预测
猜你感兴趣
版权申明
本文"[补题记录] Atcoder Beginner Contest 319(E)":http://eshow365.cn/6-9373-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 分界线-积木游戏 demo
- 下一篇: 大数据学习1.1-Centos8网络配置