在平面上有N个点,他们有各自的速度向量。现在我们给出时刻0时他们的位置


由于速度不变,所以解函数是个凹函数,凹函数的梯度是左边小于0,右边大于0。

可以根据梯度,使用二分查找梯度为0 的位置。

题目没有限制t的范围,注意初始查找的区域设定:

不能太大,如果太大,会造成计算距离溢出,而且会计算过程中会发生精度丢失,导致梯度计算错误。

不能太小,如果太小,区域很可能没有包含解的位置

试了半天,99999999999应该可以。


#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>
#include <iomanip>
#include <limits>
using namespace std;int N;
struct dot
{double x;double y;double vx;double vy;
};vector<dot> dotvec;inline double getdis(int left, int right, double time)
{dot dot1 = dotvec[left];dot dot2 = dotvec[right];dot1.x = dot1.x + dot1.vx*time;dot1.y = dot1.y + dot1.vy*time;dot2.x = dot2.x + dot2.vx*time;dot2.y = dot2.y + dot2.vy*time;double dis(0);double x = dot1.x - dot2.x;double y = dot1.y - dot2.y;double sum = pow(x, 2) + pow(y, 2);dis = pow(sum, 0.5);return dis;
}double getspecial(double time)
{double max_dis(0);for (auto i = 0; i < dotvec.size(); ++i){for (auto j = i+1; j < dotvec.size(); ++j){double dis = getdis(i, j, time);max_dis = max(max_dis, dis);}}return max_dis;
}double func()
{double left(0);double right = 99999999999;double midleft, midright(0);double dis_midleft, dis_midright;while (right - left>0.001){midleft = (right + left) / 2;midright = midleft + 0.0001;dis_midleft = getspecial(midleft);dis_midright = getspecial(midright);if (dis_midleft<dis_midright){right = midleft;}else{left = midleft;}}cout.flags(ios::fixed);cout.precision(2);cout << midleft << " " << dis_midleft << endl;return midleft;
}int main()
{while (cin >> N){dot d;dotvec.clear();for (auto i = 0; i < N; ++i){cin >> d.x;cin >> d.y;cin >> d.vx;cin >> d.vy;dotvec.push_back(d);}func();}return 0;
}

【算法题】触宝2018编程题二相关推荐

  1. 百亿题典之C++编程题面试题

    原文地址:百亿题典之C++编程题面试题作者:百亿题典 1. 在linked list中找倒数第N个结点 2. 倒转linked list 3. 二叉树的结点有指向parent的指针,求最近公共祖先 4 ...

  2. 给定两个数r和n_输出r的n次方 java_滴滴出行2018编程题

    [编程题] CIDR去重 时间限制:1秒 空间限制:65536K 无类别域间路由(CIDR)是一个用于对IPV4地址进行分类表述的方法.CIDR 路由描述的IP地址组的子网mask长度是可变长度, 例 ...

  3. c语言编程实践题,C语言实践编程题

    <C语言实践编程题>由会员分享,可在线阅读,更多相关<C语言实践编程题(11页珍藏版)>请在人人文库网上搜索. 1.C语言实践编程题一.分支结构()1. 利用一元二次方程ax ...

  4. python快速编程入门课后程序题答案-Python 入门编程题:1~10(答案)

    Python 入门编程题:1~10(答案) 提示:最好还是先思考,先编写,再看答案哦 ^_^ 1. for i in range(1, 5): for j in range(1,5): for k i ...

  5. java 初级编程题_java基础经典编程题

    java基础经典编程题 Monkey_peach代码 package com.sailor.game; /** * 题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第 ...

  6. java 编程题_最新JAVA编程题全集(50题及答案)92862

    <最新JAVA编程题全集(50题及答案)92862>由会员分享,可在线阅读,更多相关<最新JAVA编程题全集(50题及答案)92862(32页珍藏版)>请在人人文库网上搜索. ...

  7. pta中java编程题_多文件编程题

    多文件编程题与函数题相似,区别是裁判编写的判题程序可能涉及多个文件,因此不是写在题干里,而是以附件的形式供学生下载,方便学生调试.学生须按照题干上给出的要求编写程序,完成指定功能.学生的提交也可能包含 ...

  8. 2017年3月18日奇虎360 笔试真题(3个编程题)

    360笔试的编程题有3个,前面2个我都提交并AC了,最后一个刚刚写完准备提交然而笔试刚刚结束,实在有些可惜.后来在赛码网提交了,发现也是AC的. 本文中题目来源:赛码网,代码来源:笔试中写的原代码. ...

  9. c语言编程题总结,c语言编程题总结

    c语言编程题总结 1.求100之内自然数中最大的能被17整除的数. 2.已知a,b,c都是1位整数,求当三位整数abc.cba的和为1333时a.b.c的值. 3.计算并输出200-400之间不能被3 ...

最新文章

  1. Git入门教程(上)
  2. 中国“芯”的突破攻略——智源大会“智能体系架构与芯片”论坛发布
  3. 优云携手网易云 助力企业“互联网+”转型
  4. 【云原生AI】Fluid + JindoFS 助力微博海量小文件模型训练速度提升 18 倍
  5. 提高服务器并发量,有关系统配置的常规方法
  6. 世上的人大都只会“飞鸽传书下载”,没人开发
  7. TTButton 的正确使用的方法
  8. Centos运行Mysql因为内存不足进程被杀
  9. Java Web开发中,自定义过滤器被执行两次的原因分析及解决办法
  10. 贺利坚老师汇编课程47笔记:jmp short和jmp near ptr和jmp far ptr
  11. 藏不住了,Flink 未来发展的最新方向在这里!
  12. Android总结笔记04:仿QQ空间登录UI,解决软键盘弹出挡住输入框的问题
  13. android 电视安装apk文件损坏,安装电视软件时提示解析包出现问题怎么破?
  14. 服务器ip总是被封,怎么办?
  15. 魅族路由器极速版刷机_魅族路由器极速版最真实的体验评测
  16. 从百度“童年英雄的AI幻想”互动展说起,看AI如何赋能艺术?
  17. win10 桌面体验 服务器,windows server 2012 R2 安装桌面体验
  18. 36个助你成为专家需要掌握的JavaScript概念
  19. 学习并使用HC-SR04超声波测距模块+STM32
  20. 智能客服赛道:网易七鱼、微洱科技打法迥异

热门文章

  1. 公众号榜单 | 2020·5月公众号地区排行榜重磅发布
  2. JAVA中如何将大数字或字符串放进数组
  3. 世界最昂贵的十大军用飞机
  4. 复变函数:复函数的空间与Montel定理
  5. iPhone以旧换新折抵价 苹果XS用户一眨眼亏了550元
  6. 如何更高效(HOWTO: Be more productive--Aaron Swartz)
  7. android 11.0 去掉未知来源弹窗 默认授予安装未知来源权限
  8. 石墨烯 量子计算机,石墨烯鼓有望成为量子计算机内存
  9. Node 在沪江的大规模实践
  10. O_DIRECT打开文件失败