codeforces 782B - The Meeting Place Cannot Be Changed

题意:

一条线上有n个人,每个人一个坐标值xi,每个人有一个最大行走速度vi,问如果要让这n个人走到线上某一个点,最少需要多少时间。

分析:

看起来是二分,

二分坐标。

二分区间变化的条件,一开始感觉是比较当前mid坐标左右人们用最快速度到达的平均时间,

后来具体写的时候感觉是比较当前mid坐标左右人们用最快速度到达的最大时间。

其实就是后者。

如果某一边的最大时间比较大的话,坐标就要向那一边偏移,

最后循环退出的条件就是在误差以内。

代码:

 1 #include <set>
 2 #include <map>
 3 #include <list>
 4 #include <cmath>
 5 #include <queue>
 6 #include <stack>
 7 #include <vector>
 8 #include <bitset>
 9 #include <string>
10 #include <cctype>
11 #include <cstdio>
12 #include <cstring>
13 #include <cstdlib>
14 #include <iostream>
15 #include <algorithm>
16 #include <unordered_map>
17
18 using namespace std;
19
20 typedef long long ll;
21 typedef unsigned long long ull;
22 #define inf (0x3f3f3f3f)
23 #define lnf (0x3f3f3f3f3f3f3f3f)
24 #define eps (1e-6)
25 int sgn(double a) {
26     return a < -eps ? -1 : a < eps ? 0 : 1;
27 }
28
29 //--------------------------
30
31 const ll mod = 1000000007;
32 const int maxn = 100010;
33
34
35 struct friends {
36     int a, b;
37 } f[60010];
38
39 bool cmp(friends a, friends b) {
40     if(a.a != b.a)  return a.a < b.a;
41     else return a.b < b.b;
42 }
43
44 void solve() {
45     int n;
46     scanf("%d", &n);
47     for(int i = 0; i < n; i++) {
48         scanf("%d", &f[i].a);
49     }
50     for(int i = 0; i < n; i++) {
51         scanf("%d", &f[i].b);
52     }
53     sort(f, f + n, cmp);
54     double left = f[0].a, right = f[n - 1].a;
55
56     while(fabs(right - left) >= 1e-6) {
57         double mid = (left + right) / 2;
58         double lmax = 0, rmax = 0;
59         double maxtime = 0;
60         for(int i = 0; i < n; i++) {
61             if(f[i].a < mid) {
62                 lmax = max(lmax, fabs(mid - (double)f[i].a) / f[i].b);
63             } else {
64                 rmax = max(rmax, fabs(mid - (double)f[i].a) / f[i].b);
65             }
66             maxtime = max(maxtime, fabs(mid - (double)f[i].a) / f[i].b);
67         }
68         if(lmax < rmax) {
69             left = mid;
70         } else {
71             right = mid;
72         }
73     }
74     double res = fabs(left + right) / 2;
75     double ans = 0;
76     for(int i = 0; i < n; i++) {
77         ans = max(ans, fabs(res - (double)f[i].a) / f[i].b);
78     }
79     printf("%f\n", ans);
80 }
81
82 int main() {
83
84 #ifndef ONLINE_JUDGE
85     freopen("1.in", "r", stdin);
86     //freopen("1.out", "w", stdout);
87 #endif
88     // iostream::sync_with_stdio(false);
89     solve();
90     return 0;
91 }
时间: 2024-10-12 11:27:02

codeforces 782B - The Meeting Place Cannot Be Changed的相关文章

codeforces 782B The Meeting Place Cannot Be Changed+hdu 4355+hdu 2438 (三分)

B. The Meeting Place Cannot Be Changed The main road in Bytecity is a straight line from south to north. Conveniently, there are coordinates measured in meters from the southernmost building in north direction. At some points on the road there are n

【CodeForces - 238E】Meeting Her(图论+记忆化搜索)

Description 题目链接:Codeforces Solution 因为路线随机,所以找出各路线最短路必须经过的点,在这个点必定能上车 直接floyd暴力找割点 然后不断用k条公交车路线来更新DP答案,直到更新不了为止,dp[i]表示从点i到终点的答案 Code #include <cstdio> #include <algorithm> #include <cstring> #define N 1100 using namespace std; int n,m,

CF782B The Meeting Place Cannot Be Changed

题意: The main road in Bytecity is a straight line from south to north. Conveniently, there are coordinates measured in meters from the southernmost building in north direction. At some points on the road there are n friends, and i-th of them is standi

Codeforces 853B Jury Meeting

题意 从城市1-n来的评审团到城市0商讨国家大事,离开和抵达的那一天不能讨论,飞机均当天抵达,给出所有飞机起飞抵达代价情况,问能否使所有评审员聚齐连续k天并返回,并求最小代价 思路 从前向后扫一遍,求每天的出发最小代价L[i],从后向前扫,求每天最小离开代价R[i] 从前向后扫一遍,每天的最小代价为L[i]+R[i+k+1] 将每天的默认大小设为1e12,因为最大代价不超过1e11,可以据此确定答案是否合法 代码 #include<bits/stdc++.h> using namespace

Codeforces Round #403 (Div. 1, based on Technocup 2017 Finals)

Div1单场我从来就没上过分,这场又剧毒,半天才打出B,C挂了好几次最后还FST了,回紫了. AC:AB Rank:340 Rating:2204-71->2133 Div2.B.The Meeting Place Cannot Be Changed 题目大意:n个人,第i个人位于xi,速度为vi,找到一个点使得所有人到这个点的耗时最小,输出耗时.(n<=60000) 思路:二分答案,知道耗时后可以求出每个人能到达的区间,如果所有区间有交则合法,复杂度O(nlog). #include<

差分简单题集

[一维差分]Codeforces 1000C Covered Points Count 题目大意: 给定$n$个线段,给定这些线段所在的区间($l,r\leq10^{18}$),这些线段能够覆盖它们所包含的点,问你被包含$[1,n]$次的点分别有多少个. 解题分析:用差分来高效的统计一下指定区间内所被覆盖的线段个数,同时,因为$l,r$的大小非常大,所以我们需要对所有的线段进行离散化. #include <bits/stdc++.h> using namespace std; template

Jury Meeting CodeForces - 854D

Jury Meeting CodeForces - 854D 思路:暴力枚举会议开始的那一天(只需用所有向0点飞的航班的那一天+1去枚举即可),并计算所有人此情况下去0点和从0点出来的最小花费. 具体:首先,将航班分为飞入0和飞出0两类. 然后,枚举会议开始的时间p. 那么,飞入0的航班只有时间<p的生效,飞出0的航班只有时间>p+k-1的生效. 显然,在p变为p+1时,最多只有各一班航班生效与失效. (听说还能二分,但是已经打了100行了,不敢再加了...好累) 1 #include<

Codeforces 238E. Meeting Her 图论+记忆化搜索

大意: 有一个 n 个结点的有向图,边权均为 1.Urapl 想从 a 出发去 b.有 p 个公交车公司.在每 一秒的开始,第 i 个公司的公交车随机选择一条从 s i 到 t i 的最短路径然后走这条路径.如果 一个公交车经过 Urpal 所在的交叉点,则 Urpal 可以上这辆公交车,他可以在中途任意一个结 点下车. 在任何时刻 Urpal 只知道他自己的位置和约会地点.当他上了公交车时他只知道这辆公交 车属于第几个公司.当然 Urpal 知道城市地图和每个公司的 (s i , t i ).

Codeforces 714A. Meeting of Old Friends

题目链接:http://codeforces.com/problemset/problem/714/A 题意: 一个猫头鹰可以在时间段 l1 到 r1 处于清醒状态, 且需要在 k 时为自己化妆,在 l2 到 r2 时间段去访问自己的朋友, 问它能和自己的朋友在一起待多久时间. 思路: 设呆在一起的时间为 anst, 则 anst = min(r1, r2) - max(l1, l2) + 1,如果 k 处于 min(r1, r2) 和 max(l1, l2) 之间, 则还需要减去化妆的一刻: