关闭

pku 2165 gumman

307人阅读 评论(0) 收藏 举报

这是一道经典题目,很少处理空间中的问题。

only if coordinate of intersection point in a certain range, including x,y;

that is to "project ", we can get x-coordinate by calculating intersection of a serial of ranges;

next to get two angels, using project, we can solve it on a plane.

  • Source
    #include <iostream>
    #include <iomanip>
    #include <cmath>
    #define N 102
    using namespace std;
    
    const double eps = 1e-10;
    
    int n;
    struct Window
    {
    	double lbx,lby,rux,ruy;
    	double z;
    };
    istream& operator >> (istream& in, Window& win)
    {
    	in>>win.lbx>>win.lby>>win.rux>>win.ruy>>win.z;
    	return in;
    }
    
    Window window[N];
    // project to x_o_y
    // O(n)
    int cal1(double& k)
    {
    	double maxV = 1e15,minV=-1e15 ,tmax,tmin;
    	for (int I=0; I<n; ++I)
    	{
    
    		if (window[I].z != 0)
    		{
    			tmax = window[I].ruy/window[I].z;
    			tmin = window[I].lby/window[I].z;
    			maxV = min(maxV,tmax);
    			minV = max(minV,tmin);
    		}
    		if (maxV < minV)
    			break;
    	}
    	if (maxV < minV) return 0;
    	k = (minV + maxV)/2;
    	return 1;
    }
    
    int cal2(double& x)
    {
    	double maxV = 1e15, minV = -1e15,tmax,tmin;
    
    	for (int I=0; I<n-1; ++I)
    	{
    		for (int J=I+1; J<n; ++J)
    		{
    			if (window[I].z == window[J].z)
    			{
    				maxV = -1;
    				minV = 1;
    				goto fail;
    			}
    			tmin = window[I].lbx - (window[J].rux-window[I].lbx)*window[I].z/(window[J].z - window[I].z);
    			tmax = window[I].rux - (window[J].lbx-window[I].rux)*window[I].z/(window[J].z - window[I].z);
    			minV = max(minV,tmin);
    			maxV = min(maxV,tmax);
    			if (maxV < minV)goto fail;
    		}
    	}
    fail:
    	if (maxV < minV)
    		return 0;
    	x = (minV+maxV)/2;
    	return 1;
    }
    
    int caldir(double x, double & k)
    {
    	double rV = 1e15,lV=-1 ,tr,tl;
    	for (int I=0; I<n; ++I)
    	{
    		tr = (window[I].rux - x)/sqrt((window[I].rux - x)*(window[I].rux - x)+window[I].z*window[I].z);
    		tl = (window[I].lbx - x)/sqrt((window[I].lbx - x)*(window[I].lbx - x)+window[I].z*window[I].z);
    		rV = min(rV,tr);
    		lV = max(lV,tl);
    	}
    	if (rV < lV-eps)
    		return 0;
    	k = (lV+rV)/2/sin(acos((lV+rV)/2));
    	return 1;
    }
    
    void print(double k1,double x, double k2)
    {
    	for (int I=0; I<n; ++I)
    	{
    		cout<<(x + k2*window[I].z)<<' '<<window[I].z*k1<<' '<<window[I].z<<endl;
    	}
    }
    
    int main()
    {
    	cin>>n;
    	for (int I=0; I<n; ++I)
    		cin>>window[I];
    	double k1,k2;
    	double x;
    	if (cal1(k1)==0 || cal2(x)==0 || caldir(x,k2)==0)
    	{
    		cout<<"UNSOLVABLE"<<endl;
    	}
    	else
    	{
    		cout<<"SOLUTION"<<endl;
    		cout<<setiosflags(ios::fixed)<<setprecision(6)<<x<<endl;
    		print(k1,x,k2);
    	}
    	return 0;
    }
    
  • 0
    0
    查看评论
    发表评论
    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

    语料库corpus

    语料库在线 http://www.cncorpus.org/ 现代汉语语料库 http://ccl.pku.edu.cn/corpus.asp?item=1 古代汉语语料库 http://...
    • riverflowrand
    • riverflowrand
    • 2015-10-18 16:36
    • 1218

    pku 1061青蛙的约会

    扩展欧几里得 详细介绍 : http://hi.baidu.com/%B1%BF%D0%A1%BA%A2_shw/blog/item/0676025d56a87d4afbf2c093.html 扩...
    • u013849646
    • u013849646
    • 2014-03-25 01:40
    • 719

    2165: 大楼 倍增floyd

    虽然A掉了……但还是有点不明白的地方QAQ,我还是太弱了。 首先倍增floyd或矩阵乘法无误(实质上是差不多的),用f[p][i][j]表示走了2^p步从第i个房间到第j个房间最多上升了几层,转移显...
    • Phenix_2015
    • Phenix_2015
    • 2016-01-08 08:26
    • 820

    北大ACM校内赛解题报告

    今天去打酱油的。。。水了四道题,给各种IOI、ACM Final的大神跪。。。
    • lwfcgz
    • lwfcgz
    • 2014-05-10 18:53
    • 2098

    PKU四日游(信息科学夏令营)

    没什么意思的夏令营… 反正是去了,就写个游记骗访问量吧day-∞“初审结果会在七月上旬公布” 神tm就是七月十号晚上公布的………… 结合上次pkusc的“24时前公布”,然后23:50公布的事情...
    • LOI_DQS
    • LOI_DQS
    • 2016-07-27 04:51
    • 2225

    怎样学习哲学

    题目描述 OI大师抖儿在夺得银牌之后,顺利保送pku。这一天,抖儿问长者:“虽然我已经保送了,但是我还要参加学考。马上就要考政治了,请问应该怎样学习哲学,通过政治考试?” 长者回答:“你...
    • twy847727884
    • twy847727884
    • 2016-11-14 10:47
    • 198

    POJ-1042 Gone Fishing (贪心法求最佳钓鱼方案

    John is going on a fishing trip. He has h hours available (1 <= h <= 16), and there are n lakes in t...
    • u011044871
    • u011044871
    • 2014-05-06 08:43
    • 1209

    PKU 1086解题报告

    这道提很多人说是最短路径问题,可是我认为,用最短路的算法不稳定,及时间复杂度不缺定。 题意是关于换钱的问题,多种货币,换来换去,最后还是那种钱,但是钱却多了。 换钱法则是:自己的钱 减去 税费后的...
    • tiankonguse
    • tiankonguse
    • 2014-02-20 14:45
    • 358

    pku 1061 青蛙约会

    pku 10pku 1061 青蛙约会 青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total S...
    • ice__cookie
    • ice__cookie
    • 2014-07-29 13:43
    • 213

    PKU 学生的反馈 2009-1

    反馈1: 软件实现技术课程总结 (1) 本学期的《软件实现技术》课程顺利结束了。作为选择这门课的学生,我在这里对这门课做一个回顾,并总结一下我对这门课的一些感受。 《软件实现技术》这门课是微软和北大软...
    • SoftwareTeacher
    • SoftwareTeacher
    • 2014-05-14 13:58
    • 400
      个人资料
      • 访问:42791次
      • 积分:834
      • 等级:
      • 排名:千里之外
      • 原创:37篇
      • 转载:6篇
      • 译文:0篇
      • 评论:4条
      文章分类