logn_sort 2023-01-30 12:47 采纳率: 50%
浏览 158
已结题

关于#开会#的问题,如何解决?(语言-c++)

题目描述:

在x轴上有n个人,每个人有一个移动速度 vi, 现在需要找一个地方让大家聚到一起开会,问你最少需要多少时间才可以让所有人都到达同一个点

输入格式:
第一行输入一个整数n
第二行输入n个整数

xi 表示每个人初始的位置

第三行输入n个整数

vi 表示每个人的移动速度

输出格式:
输出一个浮点数,保留五位小数,四舍五入。比如答案为2.333336,就输出2.33334

样例输入1:
3
7 1 3
1 2 1
样例输出1:
2.00000

样例输入2:
10
2 3 5 7 11 13 17 19 23 29
6 5 4 3 2 1 2 3 4 5
样例输出2:
2.75000

大家可以给个思路么?

  • 写回答

6条回答 默认 最新

  • hurp13 2023-01-31 01:41
    关注

    这道题目是求所有人都到达同一个点的最短时间。

    思路:

    1.先求出初始位置的最大值和最小值。
    2.再求出所有人移动速度的最大值。
    3.最后用 (最大位置 - 最小位置) ÷ 最大移动速度 即为所有人到达同一点的最短时间。

    1. #include <iostream>
    2. #include <algorithm>
    3. #include <cstring>
    4. using namespace std;
    5. const int N=1e5+10;
    6. int n,p[N],v[N];
    7. double dfs(double x)
    8. {
    9. double l=1e9,r=-1e9;
    10. for(int i=0;i<n;i++)
    11. {
    12. l=min(l,p[i]+v[i]*x);
    13. r=max(r,p[i]+v[i]*x);
    14. }
    15. return (r-l)/2.0;
    16. }
    17. int main()
    18. {
    19. cin>>n;
    20. for(int i=0;i<n;i++) cin>>p[i];
    21. for(int i=0;i<n;i++) cin>>v[i];
    22. double l=0,r=1e9;
    23. while(r-l>1e-5)
    24. {
    25. double mid=(l+r)/2.0;
    26. if(dfs(mid)<=0) r=mid;
    27. else l=mid;
    28. }
    29. printf("%.5f",r);
    30. return 0;
    31. }

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    logn_sort 2023-02-01 05:28

    @hurp13 谢谢

    回复
查看更多回答(5条)
编辑
预览

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月2日
  • 已采纳回答 2月2日
  • 创建了问题 1月30日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部