已经AC 触宝编程题 第二题 三分时间

#大概的思路就是 默认这个距离(最大两点的距离)函数是时间变量的一个凸函数(我猜的,具体证明不会),凸函数找最大值,用三分法就可以了。 然后就三分时间则可以求得答案


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

const int MX = 308;
const double eps = 0.00001;
struct V{
    double _x, _y;
    V(){}
    V(double x, double y):_x(x),_y(y){}
    V operator *(double mul) const{
        return V(mul*_x, mul*_y);
    }
    V operator +(const V & v1) const{
        return V(_x+v1._x, _y+v1._y);
    }
    double dis(const V & v1){
        double sum1 = _x - v1._x; sum1 *= sum1;
        double sum2 = _y - v1._y; sum2 *= sum2;
        return sqrt(sum1+sum2);
    }
    void pf(){
        printf("point :%lf %lf\n", _x, _y);
    }
};
int n;
V point[MX];
V speed[MX];
V now[MX];
double get_dis(double tim){
    for(int i = 0; i < n; i++){
        now[i] = point[i] + speed[i]*tim;
    }
    double tmax = 0.0;
    for(int i = 0; i < n; i++){
        for(int j = i+1; j < n; j++){
            tmax = max(tmax, now[i].dis(now[j]));
        }
    }
    return tmax;

}
int main(){
    while(cin>>n){
        for(int i = 0;i < n;i++){
            double x,y;scanf("%lf%lf",&x,&y);
            point[i] = V(x,y);
            double sx,sy;scanf("%lf%lf",&sx,&sy);
            speed[i] = V(sx,sy);
        }
        double res = get_dis(0.00);
        double flag_time = 0.00;
        double l = 0.00;
        double r = 1000000000.00;
        while(l < r - eps){
            double mid1 = (l+r)*0.5;
            double mid2 = (l+mid1)*0.5;
            double res1 = get_dis(mid1);
            double res2 = get_dis(mid2);
            if(res1 < res2){
                l = mid2;
                if(res1 < res){
                    flag_time = mid1;
                    res = res1;
                }
            }
            else{
                r = mid1;
                if(res2 < res){
                    flag_time = mid1;
                    res = res1;
                }
            }
        }
        printf("%.2lf %.2lf\n",flag_time, res);
    }
    return 0;
}

#C++工程师#
全部评论
好厉害啊~
点赞 回复 分享
发布于 2017-09-05 21:28
AC了吗
点赞 回复 分享
发布于 2017-09-05 21:05
这我就不得不膜拜了
点赞 回复 分享
发布于 2017-09-05 21:06
AC的代码
点赞 回复 分享
发布于 2017-09-05 21:26
COOL.
点赞 回复 分享
发布于 2017-09-05 21:26
大佬啊,我还用暴力做的…
点赞 回复 分享
发布于 2017-09-05 21:34
膜拜大佬!!!!!!!!!!!!
点赞 回复 分享
发布于 2017-09-05 21:38
整体应该是凸函数,而且没有局部解,相当于聚类只有一个解。
点赞 回复 分享
发布于 2017-09-05 21:42
大佬,有题目么
点赞 回复 分享
发布于 2017-09-05 22:03
总算有个人懂我的意思了......
点赞 回复 分享
发布于 2017-09-05 22:06

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
威猛的小饼干正在背八股:挂到根本不想整理
点赞 评论 收藏
分享
点赞 6 评论
分享
牛客网
牛客企业服务