#17-【二分】gdgzoi::比赛.Contest2281.Problem D (包裹快递)(zly#1)
?
?
Problem D: 包裹快遞
Time Limit:?1000 ms ??Memory Limit:?128 MB
- Submit?
- Solution
Description
一個快遞公司要將n個包裹分別送到n個地方,并分配給郵遞員MCHacker一個事先設定好的路線,MCHacker需要開車按照路線給的地點順序相繼送達,且不能遺漏一個地點。MCHacker得到每個地方可以簽收的時間段,并且也知道路線中一個地方到下一個地方的距離。若到達某一個地方的時間早于可以簽收的時間段,則必須在這個地方停留至可以簽收,但不能晚于簽收的時間段,可以認為簽收的過程是瞬間完成的。
為了節省燃料,MCHacker希望在全部送達的情況下,車的最大速度越小越好,就找到了你給他設計一種方案,并求出車的最大速度最小是多少。
?
Input
第1行為一個正整數n,表示需要運送包裹的地點數。
下面n行,第i+1行有3個正整數xi,yi,si,表示按路線順序給出第i個地點簽收包裹的時間段為[xi, yi],即最早為距出發時刻xi,最晚為距出發時刻yi,從前一個地點到達第i個地點距離為si,且保證路線中xi遞增。
可以認為s1為出發的地方到第1個地點的距離,且出發時刻為0。
?
Output
僅包括一個整數,為車的最大速度最小值,結果保留兩位小數。
Sample Input
31 2 26 6 27 8 4Sample Output
2.00HINT
對于20%的數據,n≤10;
對于30%的數據,xi,yi,si≤1000。
對于50%的數據,n≤1000;
對于100%的數據,n≤200000;xi≤yi≤10^8;si≤10^7。
?
?
提示
?
第一段用1的速度在時間2到達第1個地點,第二段用0.5的速度在時間6到達第2個地點,第三段用2的速度在時間8到達第3個地點。
?
?
來源
?
Vijos 1450.感謝lzctuhao!
?
二分。
#include <iostream>#define SIZE 200001using namespace std;long double x[SIZE], y[SIZE], s[SIZE]; int n;bool check(long double _x) {long double tot = 0;int i;for (i = 1; i <= n; i++){if (tot + s[i] / _x > y[i]) // 來遲了,不成{return false;}tot += s[i] / _x;if (tot < x[i]) // 來早了,要等待{tot = x[i];}}return true; // 全部送達,成 }int main(void) {int i;long double l = 0, r = 99999999, mid, res;cin >> n;for (i = 1; i <= n; i++){cin >> x[i] >> y[i] >> s[i];}while (l <= r) // 二分過程{mid = (l + r) / 2;if (check(mid)){r = mid - 0.001;res = mid;}else{l = mid + 0.001;}}printf("%.2Lf\n", res);return 0; }總結
以上是生活随笔為你收集整理的#17-【二分】gdgzoi::比赛.Contest2281.Problem D (包裹快递)(zly#1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 管螺纹如何标注_你所不知道的机械螺纹全面
- 下一篇: 随意发软件如何自动发帖已更新2022