三分题两道:lightoj1146 Closest Distance、lightoj1240 Point Segment Distance (3D)

lightoj1146

Two men are moving concurrently, one man is moving from A to B and other man is moving from C to D. Initially the first man is at A, and the second man is at C. They maintain constant velocities such that when the first man reaches B, at the same time the second man reaches D. You can assume that A, B, C and D are 2D Cartesian co-ordinates. You have to find the minimum Euclidean distance between them along their path.

 

Input
Input starts with an integer T (≤ 1000), denoting the number of test cases.

Each case will contain eight integers: Ax, Ay, Bx, By, Cx, Cy, Dx, Dy. All the co-ordinates are between 0 and 100. (Ax, Ay) denotes A. (Bx, By) denotes B and so on.

Output
For each case, print the case number and the minimum distance between them along their path. Errors less than 10-6 will be ignored.

Sample Input
3
0 0 5 0 5 5 5 0
0 0 5 5 10 10 6 6
0 0 5 0 10 1 1 1

Output for Sample Input
Case 1: 0
Case 2: 1.4142135624
Case 3: 1

题意:小明从A点出发走到B点,小红从C点出发走到D点,已知小明到达B点的同时小红到达D点,还有ABCD的坐标

求小明和小红之间的最近♂距离

题解:三分时间,如果mid1比mid2距离小。那么答案肯定在l~mid2中

反之则一定在mid1~r中

然后据此随便三分个1000次,答案也就符合精度了。

蜜汁尴尬的TLE

代码如下,也是难得这么短。

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

int t,ttt=0,ax,ay,bx,by,cx,cy,dx,dy,times;

double diss(double mid)
{
    double x1,y1,x2,y2;
    x1=ax+(bx-ax)*mid;
    y1=ay+(by-ay)*mid;
    x2=cx+(dx-cx)*mid;
    y2=cy+(dy-cy)*mid;
    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        ttt++;
        scanf("%d%d%d%d%d%d%d%d",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy);
        double l=0,r=1,mid1,mid2;
        times=10000;
        while(times--)
        {
            mid1=(l+l+r)/3;
            mid2=(l+r+r)/3;
            double dis1=diss(mid1),dis2=diss(mid2);
            if(dis1<dis2)
            {
                r=mid2;
            }
            else
            {
                l=mid1;
            }
        }
        printf("Case %d: %.6lf\n",ttt,sqrt(diss(l)));
    }
}

lightoj1240

Given a segment in 3D space, identified by A(x1, y1, z1), B(x2, y2, z2) and another point P(x, y, z) your task is to find the minimum possible Euclidean distance between the point P and the segment AB.

 

Input
Input starts with an integer T (≤ 10000), denoting the number of test cases.

Each case starts with a line containing nine integers x1, y1, z1, x2, y2, z2, x, y, z. The magnitude of any integer will not be greater than 100.

Output
For each case, print the case number and the distance. Errors less than 10-6 will be ignored.

Sample Input
Output for Sample Input
2
0 0 1 0 1 1 0 1 0
0 0 0 1 1 1 0 0 1
Case 1: 1
Case 2: 0.8164965809

题意:给出三维平面上的一条线段和一个点

求点到该线段的最短距离。

题解:

这道题令学车中学的在下不胜尴尬啊,因为半个月前刚做过啊……

基础训练搬原题也是醉了。

之前是用平面几何的做法,只有70分

现在一看也是可以三分的。

同样假设一个人从A走到B

三分时间即可。

代码如下:

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

int t,ttt,ax,ay,az,bx,by,bz,px,py,pz,times;

double diss(double mid)
{
    double x1,y1,z1;
    x1=ax+(bx-ax)*mid;
    y1=ay+(by-ay)*mid;
    z1=az+(bz-az)*mid;
    return (px-x1)*(px-x1)+(py-y1)*(py-y1)+(pz-z1)*(pz-z1);
}

int main()
{
    scanf("%d",&t);
    while(t--)
    {
        ttt++;
        scanf("%d%d%d%d%d%d%d%d%d",&ax,&ay,&az,&bx,&by,&bz,&px,&py,&pz);
        times=1000;
        double l=0,r=1,mid1,mid2;
        while(times--)
        {
            mid1=(l+l+r)/3;
            mid2=(l+r+r)/3;
            double dis1=diss(mid1),dis2=diss(mid2);
            if(dis1>dis2)
            {
                l=mid1;
            }
            else
            {
                r=mid2;
            }
        }
        printf("Case %d: %.6lf\n",ttt,sqrt(diss(l)));
    }
}

 

原文地址:https://www.cnblogs.com/stxy-ferryman/p/8503920.html

时间: 2024-10-21 07:57:27

三分题两道:lightoj1146 Closest Distance、lightoj1240 Point Segment Distance (3D)的相关文章

任务调度分配题两道 POJ 1973 POJ 1180(斜率优化复习)

POJ 1973 这道题以前做过的.今儿重做一次.由于每个程序员要么做A,要么做B,可以联想到0/1背包(谢谢N巨).这样,可以设状态 dp[i][j]为i个程序员做j个A项目同时,最多可做多少个B项目.枚举最后一个程序员做多少个A项目进行转移(0/1). dp[i][j]=max{dp[i-1][k]+(time-(j-k)*a[i])/b[i]}.于是,二分时间time进行判定即可. #include <iostream> #include <cstdio> #include

逛园子,看到个练习题,小试了一把(淘宝ued的两道小题)

闲来无事,逛园子,充充电.发现了一个挺有意思的博文,自己玩了一把. 第一题:使用 HTML+CSS 实现如图布局,border-widht 1px,一个格子大小是 60*60,hover时候边框变为橘红色(兼容IE6+,考虑语义化的结构) 效果图: 简单分析一下: 使用伪类 :hover的时候相对定位 改变z-index, 代码如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta c

ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)

两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory:360K #include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; #define

[sdut]2623+[sdut]2878//四五届省赛中的两道数学期望

两道数学期望的题今天一起总结上来. 1.the number of steps(第四届省赛) 1 #include <iostream> 2 #include <string.h> 3 #include <iomanip> 4 using namespace std; 5 double dp[100][100]; 6 int n; 7 double a,b,c,d,e; 8 9 int main() 10 { 11 while(cin>>n&&

告诉我图样图森破的两道简单C++笔试题

今晚刷了一大堆的笔试题,中规中矩,但是有两道做得很快但是都错了的题目,印象深刻. (要找工作的大四渣有没有共鸣,在学校明明很努力,但是总是跟不上时代,没有厉害的项目,也没有过人的竞赛成绩,内推屡屡失败,前天阿里巴巴在线笔试也被虐死,真心迷惘,唯独刷题搞笔试了.) 第一道题是关于宏定义的. #include<iostream> using namespace std; #define fun(n) (n-1)*n int main() { int x=3; cout<<fun(x+3

两道笔试题的感触

今天做了两道笔试题,收益良多.有些题,你会发现,虽然并不难,但是却很容易没有思路或者出错,这都是源自平时的不求甚解.很多知识点,自以为已经掌握,其实只是管中窥豹,可见一斑.不要一味墨守成规,也要用于思考,很多东西既要知其然,也要知其所以然.我一直觉得了解和精通中间差着十万八千里,看来还有很长一段路要走.只有比别人更早.更勤奋地努力,才能尝到更加成功的滋味.哈哈,跑题了. 下面看一下两道笔试题.一.大概简单地说一下,求下面这段代码的结果. new Thread(new Runnable() { p

水了两道括号匹配

POJ 1141 给一段括号序列,要求增加最少的括号,使之合法,输出序列. dp[i][j]表示使给定序列的i到j成为合法序列所需添加的最少括号数,dp[0][length-1]即是答案,转移的话,如果s[i]和s[j]可以匹配那么dp[i][j] = dp[i+1][j-1],否则就考虑在中间选择一个位置m,使分割成的两个序列各自成为合法序列.方案的话就是多开一个数组记录然后递归输出.状态是从长度小的序列转移到长度长的序列,所以两层循环,外层枚举长度,内层枚举头位置即可.写成记忆化搜索简单一点

两道拓扑排序的问题

多久没写东西了啊.... 两道拓扑排序Liv.1的题....方法是一样的~~ <拓扑排序·二> 题目:http://hihocoder.com/contest/hiho81/problem/1 一个电脑网路,单向边,如果存在边u->v,那么u的病毒会感染到v. 要点,不存在环!那么如果u的入度=0的话,那么u中的病毒数不会再变化. 想到拓扑排序.不断删去入度为0的点.每次删去节点u,如果存在u->v,那么病毒数 num[v] += num[u].问题解决. (用queue实现拓扑排

ACM/ICPC 之 两道dijkstra练习题(ZOJ1053(POJ1122)-ZOJ1053)

两道较为典型的单源最短路径问题,采用dijkstra解法 本来是四道练习题,后来发现后面两道用dijkstra来解的话总觉得有点冗余了,因此暂且分成三篇博客(本篇以及后两篇). ZOJ1053(POJ1122)-FDNY to the Rescue! 1 //POJ1122-ZOJ1053 2 //dijkstra-需要记录路径 3 //给出n个路口的邻接矩阵,求给定多个火警到失火点的时间及任一路径 4 //注意输入最后一行时,cin.getline需要两次,猜测需要接受邻接矩阵最后一行其他字符