`
lgh1992314
  • 浏览: 315575 次
文章分类
社区版块
存档分类
最新评论

三分法Easy Problem

 
阅读更多

Easy Problem

时间限制:1000ms | 内存限制:65536KB
描述

In this problem, you're to calculate the distance between a pointP(xp,yp,zp) and a segment (x1,y1,z1) − (x2,y2,z2), in a 3D space, i.e. the minimal distance from P to any pointQ(xq,yq,zq) on the segment (a segment is part of a line).

输入

The first line contains a single integer T (1 ≤T≤ 1000), the number of test cases. Each test case is a single line containing 9 integersxp,yp,zp,x1,y1,z1,x2,y2,z2. These integers are all in [-1000,1000].

输出

For each test case, print the case number and the minimal distance, to two decimal places.

样例输入
3
0 0 0 0 1 0 1 1 0
1 0 0 1 0 1 1 1 0
-1 -1 -1 0 1 0 -1 0 -1
样例输出
Case 1: 1.00
Case 2: 0.71
Case 3: 1.00

不满足单调性,所以不能直接二分查找,三分查找。

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const double EPS = 1e-8;

struct Node{
	double x;
	double y;
	double z;
};

double Cal(Node p1,Node p2)
{
	return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)+(p1.z-p2.z)*(p1.z-p2.z));
}

double Solve(Node p,Node p1,Node p2)
{
	Node mid,midmid;
	Node left = p1,right = p2;
	double mid_len,midmid_len;
	while(Cal(left,right)>EPS)
	{
		mid.x = (left.x + right.x) / 2.0;
		mid.y = (left.y + right.y) / 2.0;
		mid.z = (left.z + right.z) / 2.0;
		midmid.x = (mid.x + right.x) / 2.0;
		midmid.y = (mid.y + right.y) / 2.0;
		midmid.z = (mid.z + right.z) / 2.0;
		mid_len = Cal(p, mid);
		midmid_len = Cal(p, midmid);
		if (mid_len <= midmid_len)
			right = midmid;
		else
			left = mid;
	}
	return Cal(p,left);
}

int main()
{
	freopen("in.txt","r",stdin);
	int count = 1;
	int t;
	cin>>t;
	Node p,l,r;
	while(t--)
	{	
		cin>>p.x>>p.y>>p.z;
		cin>>l.x>>l.y>>l.z;
		cin>>r.x>>r.y>>r.z;
		printf("Case %d: %.2lf\n",count++,Solve(p,l,r));
	}
}


分享到:
评论

相关推荐

    三分法求最大值

    "三分法求最大值" 三分法是求解凸性函数的极值问题的一种方法。凸性函数是指函数在定义域内的所有点的函数值都是非负的或非正的函数。三分法是一种分治方法,适用于求解凸性函数的极值问题。 三分法的基本思想是将...

    三分法求极值

    ### 三分法求极值详解 #### 一、引言 在计算机科学和数学领域,寻找函数极值是一项重要的任务,特别是在优化问题中。对于一些特定类型的函数,例如凸函数,传统的二分法可能不再适用。在这种情况下,三分法提供了...

    LeetCode_java_leetcode_刷题_

    LeetCode中的题目涵盖了数据结构、算法、设计模式等多个方面,每道题目都分为Easy、Medium、Hard三个难度级别,适合不同程度的开发者。通过解决这些问题,你可以深入理解Java的基础特性,例如类、对象、封装、继承、...

    資料通訊網路4E第一章解答

    2. **资料通讯网络的应用**:资料通讯网络可以用于提升安全性(Security)、分布式数据库(Distributed Databases)、协同处理(Collaborative Processing)以及加快问题解决(Faster Problem Solving)的速度。 3. **网络...

    计算几何PPT

    - **POJ2826 An Easy Problem?!**: 这道题目要求计算由两条线段构成的容器的最大容水量。可以通过计算线段之间的距离和高度差来解决。 - **判断点在多边形内**: 可以使用叉积或射线法来判断一个点是否位于多边形内部...

    中考英语形容词副词比较级最高级复习课件[1] (3).ppt

    4. 以"辅音字母+y"结尾的双音节词,改"y"为"i"再加"-er",如"easy → easier"。 5. 多音节词和部分双音节词在词前加"more",如"interesting → more interesting"。 不规则变化的形容词有特定的比较级形式,例如...

    湖南省娄底市2021届高三下学期高考仿真模拟考试英语试题 Word版含答案.docx

    - **第11题**:What is the man's problem? A. His suitcase is left in the taxi. B. His suitcase is left in the station. C. His suitcase is taken by someone. - **第12题**:What did the man find on the ...

    四级作文:给出原因的36个万能句.pdf

    7. "it is easy to understand the reasons for this (prejudice against) something. One problem is that to most of us, doing something looks like doing something." 这句话用于解释看似显而易见的原因,如:...

    zoj题目简单归类zoj题目简单归类

    #### #2965 Easy Problem 题目描述过于简单,可能只需要基本的编程知识就能解决。解决策略是理解题目要求,然后使用适当的算法或数据结构来实现题目要求的功能。 通过对上述题目进行解析,我们可以看到,即使在...

    leetcode答案-LeetCode:我的力扣答案

    这些题目通常分为三大类别:Easy、Medium和Hard,以满足不同水平的开发者需求。通过解决这些问题,你可以提高你的编程思维,熟悉常用的算法和数据结构,这对于任何IT职业来说都是宝贵的技能。 Python和Shell是两种...

    leetcode答案-leetcode:leetcode

    这些问题通常被分为“Easy”、“Medium”和“Hard”三个难度级别,以适应不同水平的程序员。 【描述】"这个资源包含了LeetCode上一些问题的解答。它是一个代码仓库,可能包含多个编程语言的实现,每个问题的解答都...

Global site tag (gtag.js) - Google Analytics