hdu4741
2013年两场网络赛已经过了,之前的现场赛拿了多次铜牌,而这两场网络赛我们都表现得这么水,不由得感慨起来,ACM竞赛生涯就要画上句号了,甚至整个学习生涯中这种纯学术的竞赛都要完了。这两场网络表现得不好,痛定思痛,当然主要原因是我自己的水平太弱了,技不如人当然惨败了。赛后看各种报告和代码比较后也发现了,也许弱校弱的地方并不都是我们不够聪明和努力吧。所以这里我要特别吐槽一些地方。
第一,我觉得学校本身投入度不够,和如今一些学校的教育目标和方式不是特别好。我有一万次想写信给校长,但是又怕文采不好起不了反应或者文章感情过于激昂惹来祸端,要是给记个过,就亏大了。为什么我觉得学校本应该是无私教学育人的,而学校很多时候做得像投资一样?比如,我真心选修一些高质量理学公共课程,诸如离散数学之类而学校没有,连高等数学、线性代数、概率论这样老师大都是直接教怎么解题、记公式背公式。连物理这样美妙的学科最后竟然成了跟毛概一样的东西,shit!我就不懂了,为什么大学物理和物理实验、概率论应该还是属于“阉割”版的。有时候,很认真做物理实验或者其他计算机实验的,也不知道老师们仔细看了报告了没有。最让人抓狂的是,也许在所有人都没有意识的时候,也许改你作业的是个水平菜得像个鸟一样的研究生,然后你改进了老师给的标准算法,他一个看不懂,这次作业就算交过了、刚刚及格!好了,说点重点吧,学校的理学诸如数学、物理这样的学科太弱,其他地方再好能好到哪里去,好景又能有多长。完全只懂工科毕业的同学,工作能力能胜过普通社会青年和农民大叔多少,甚至很多地方还要欠缺很多吧。而一些领导者却认为,短期看不到成效的教学投资不值得!
第二,首先我还是想特别感谢一下我的教练,我觉得他的才华、智慧是毋庸置疑的,而且我觉得他在教学育人上是个特别有思想值得敬爱的老师。刚大一、甚至到大二的时候,我都还在之前的象牙塔里。到了大三,开始要全部投入进来。很幸运,第一次参加现场赛拿到了奖牌,可能是太紧张了,不然那时候真的可以拿到一个银牌。但是后面的路确实苦涩。有时候,很多算法并不像一般的算法那样来源于实际,容易吸收。特别是跟数学(离散数学)有关的,如果是第一次见到的,那就完全只能看了。而解决的办法只有一个——刷题!然后看各种不知道是不是原创的报告,各种猜各种若无边际的验证,(almost all on your own).
好吧,还是回到主题吧。这道题的大意是给空间上两条直线,(每条直线给出两个点的坐标,轴坐标范围+-10^4)求公垂线段的长度及其两端点坐标。
虽然这道题弹了30+次,我还是很想说说我的思路。
假设F是AB上的垂足,E是CD上的垂足。将AB向两端扩展,保证F会在AB中间,CD也是类似。
然后三分在线段AB上取点X,在F附近的X能让|XD|+|CX|。对CD也是同样。
这样算得Xab,Xcd。由于AB、CD被扩展了,所以这次的Xab、Xcd只能是粗略估计。
假设粗略估计的精度是0.1,那么以Xab为起点往AB两个方向扩展1个单位长度得到新的AB,对Xcd也是同样。
再次进行三分搜索答案。
结果就一直在TLE和WA之间徘徊。因为题目中AB、CD可能重点,是零向量,无法扩展!我真想说脏话,为毛官方的说话搞一个专门的话题板,话题板那么多还不支持搜索,每翻一个页面等要等10秒!!!同样的问题,有的回复了有的没回复,这不是坑爹吗?整个过程个,admin一直在说No response,然后强调注意实际问题。怎么说呢?我承认这是一个能力,但是:第一发散思维往往是多方向的;另外我们有太多时候被教育要严格遵守描述, 这个时候要我们自主发挥,会很大程度加大运气因素而不是算法知识和编程水平较量了!
好了,看了清华ACE的代码,理了一下思路。可读性还是挺好,重写了一下。求公共垂线段长还是很容易的,但是有个地方还是不理解。求路过的大神指教一下。
贴个代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
struct point{
double x,y,z;
point(double p1=,double p2=,double p3=){ x=p1,y=p2,z=p3; }
void getAX(){ scanf("%lf%lf%lf",&x,&y,&z); }
void putAX(){ printf("%.6f %.6f %.6f",x,y,z); }
double getdist(point B=point()){ return sqrt((x-B.x)*(x-B.x)+(y-B.y)*(y-B.y)+(z-B.z)*(z-B.z)); }
point operator-(point B){ return point(x-B.x,y-B.y,z-B.z); }
point operator+(point B){ return point(x+B.x,y+B.y,z+B.z); }
point operator*(double rat){ return point(x*rat,y*rat,z*rat); }
point cross(point B){ return point(y*B.z-z*B.y,z*B.x-x*B.z,x*B.y-y*B.x); }
double dot(point B) { return x*B.x+y*B.y+z*B.z; }
void normalize(){ (*this)=(*this)*(/this->getdist()); }
point normal(){ return (*this)*(/this->getdist()); }
};
point A,B,C,D,k1,k2;
int main()
{
int cases; cin>>cases;
for(int cas=;cas<=cases;cas++){
A.getAX(); B.getAX();
C.getAX(); D.getAX();
point AB=B-A,CD=D-C;
point ver=AB.cross(CD);
ver.normalize();
double len=(C-A).dot(ver);
printf("%.6f\n",fabs(len));
ver = ver*len;
//*********神算法,不理解***************
k1=AB.normal(), k2=CD.normal();
point AC=C-A;
point k1_k2=k1+k2;
double t1=AC.dot(k1_k2)/(k1_k2.getdist()*k1_k2.getdist());
k1_k2=k1-k2;
double t2=AC.dot(k1_k2)/(k1_k2.getdist()*k1_k2.getdist());
point F=A+k1*(t1+t2);
point E=C-k2*(t1-t2);
//**************************************
F.putAX(); printf(" ");
E.putAX(); printf("\n");
}
return ;
}
hdu4741的更多相关文章
- [数]昨天欠下的一道立体几何题HDU-4741
并没有做到这道题,后来听学长说了题意,总之就是立体几何嗯 看了好几份题解,是的我知道是异面线段的距离了,可是看码完全不明orz. 这时候出现了一份清晰易懂甚至给出了公式来源的blog╰(*°▽°*)╯ ...
- 三维空间直线最近点对hdu4741
//求两条直线之间的关系(三维) //输入:两条不为点的直线 //输出:相交返回XIANGJIAO和交点p,平行返回PINGXING,共线返回GONGXIAN int LineAndLine(Line ...
随机推荐
- AlertView点击确定后再执行后面的代码
AlertView的show方法执行后,后面的代码会继续运行,而不会等待用户按键结束再走,这样,如果把弹出的代码写在一个BOOL函数里,没等用户确认直接返回NO就惨了,解决方法: - (BOOL)be ...
- 为何与0xff进行与运算
为何与0xff进行与运算 在剖析该问题前请看如下代码 public static String bytes2HexString(byte[] b) { String ret = "" ...
- javascript高级程序设计一(1-80)
源代码研究,实例:http://fgm.cc/learn/ js面试知识点: 1:原生.闭包.上下文.call.apply.prototype. 2:jsonp:用script标签实现跨域.xss:j ...
- C语言版推箱子
推箱子源代码初步: #include<stdio.h> #include<conio.h> #include<stdlib.h> #define boolean i ...
- Java学习之Comparable与Comparator的区别
Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序 ...
- Jexus 配置多个站点
一:jexus配置站点的文件在 siteconf文件夹中,里面有多少个配置文件,就可以配置多少个站点 如我的里面有3个配置文件,其中default是原始文件,site1和siteconf就是我网站的配 ...
- crontab Linux定时器工具
要使用crontab定时器工具,必须要启动cron服务: service cron start crontab的语法,以备日后救急.先上张超给力的图: crontab各参数说明: -e : 执行文字编 ...
- http://blog.csdn.net/zhanglvmeng/article/details/11928469
本系列主要结合<PHP和MYSQL WEB开发 第四版>,在阅读中提出自己认为比较重要的一些问题,以加深对知识的了解程度. 1.简短.中等以及冗长风格的表单变量 $name; //简短风格 ...
- c++中vector与list的区别
c++标准库中,容器vector和list都可以用来存放一组类型相同的数据.而且二者不同于数组的一点是,支持动态增长.但它们还是有有几点不同 (1) vector是顺序表,表示的是一块连续的内存,元 ...
- 异构数据源海量数据交换工具-Taobao DataX 下载和使用
DataX介绍 DataX是一个在异构的数据库/文件系统之间高速交换数据的工具,实现了在任意的数据处理系统(RDBMS/Hdfs/Local filesystem)之间的数据交换. 目前成熟的数据导入 ...