触宝笔试第二题

用得一元二次方程求解,第二个样例结果是31.83,奇怪了,各位大佬能说说你们的思路吗?

全部评论
我想问下 样例给的答案是多少?
点赞 回复 分享
发布于 2017-09-05 21:11
问题是min_t{max_i,j(dis(point_i,point_j))},31都是把t=0时刻的sd拿去算了
点赞 回复 分享
发布于 2017-09-05 21:10
根据时间t线性增加,在每个时刻求距离最大的两个点,在取每个时刻当时的special dot的距离,从其中取最小。如 dist_t1=20,dist_t2=15,dist_t3=5,dist_t4=10,这样就得到t3时刻,最小距离是5。
点赞 回复 分享
发布于 2017-09-05 21:08
我也是,兼职**
点赞 回复 分享
发布于 2017-09-05 21:05
我也是8.89,31
点赞 回复 分享
发布于 2017-09-05 21:05
#include <cmath> #include <iomanip> #include <iostream> #include <sstream> using namespace std; typedef struct Point{ double x; double y; double i; double j; }Point; double cal(Point p, Point q) { double t = -((p.x - q.x)*(p.i - q.i) + (p.y - q.y)*(p.j - q.j))/(pow(p.i-q.i,2)+ pow(p.j - q.j, 2)); if (t > 0) return t; else return 0; } double dis(Point p, Point q,double t) { double d = pow((p.x - q.x + (p.i - q.i)*t), 2) + pow((p.y - q.y + (p.j - q.j)*t), 2); if (d > 0) return sqrt(d); else return 0; } int main() { int n; while (cin >> n) { Point *point = new Point[n]; for (int i = 0; i < n; i++) { cin >> point[i].x >> point[i].y >> point[i].i >> point[i].j; } double *t=new double[n*(n-1)/2]; double *d = new double[n*(n - 1) / 2]; int count = 0; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { t[count]= cal(point[i], point[j]); d[count] = dis(point[i], point[j], t[count]); //cout << t[count] << " " << d[count] << endl; count++; ; } } double max = -1; int label; for (int i = 0; i<count; i++) { if (max < d[i]) { max = d[i]; label = i; } } cout << setprecision(2) << std::fixed << t[label] <<" "<< d[label] << endl; } } 不知道为什么过,测试用例都A了。。
点赞 回复 分享
发布于 2017-09-05 21:04

相关推荐

真的很糟糕:不一定是你的问题,当然你也可以做的更好一些,继续投相信自己一定会有的
点赞 评论 收藏
分享
驼瑞驰_招募评论官版...:反正我信了,上牛客,拿offer
腾讯开奖372人在聊
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务