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的更多相关文章

  1. [数]昨天欠下的一道立体几何题HDU-4741

    并没有做到这道题,后来听学长说了题意,总之就是立体几何嗯 看了好几份题解,是的我知道是异面线段的距离了,可是看码完全不明orz. 这时候出现了一份清晰易懂甚至给出了公式来源的blog╰(*°▽°*)╯ ...

  2. 三维空间直线最近点对hdu4741

    //求两条直线之间的关系(三维) //输入:两条不为点的直线 //输出:相交返回XIANGJIAO和交点p,平行返回PINGXING,共线返回GONGXIAN int LineAndLine(Line ...

随机推荐

  1. 测试中的代码分享~将可以合并的方法去合并Func不赖

    在面向对象的设计中,我们经常会谈到“重构”,而重构之中有个叫合并方法的,就是将多个方法干的事类似,或者说,方法体的长向很像,那么,我们需要去考虑,将它们进行抽象! 原来的代码: /// <sum ...

  2. Shortest Path(思维,dfs)

    Shortest Path  Accepts: 40  Submissions: 610  Time Limit: 4000/2000 MS (Java/Others)  Memory Limit: ...

  3. WinEdt7.0 初试

    刚刚开始学的时候,安装就出了些问题(关于安装的问题,请看我之前的文章)不知道如何点击运行,编译.看了些博客论坛.终于成功了. 首先先写一个小代码: \documentclass[UTF8]{ctexa ...

  4. android混淆打包配置(忽略第三方jar)

    在project.properties里加上   proguard.config=proguard.cfg proguard.cfg 配置如下: -optimizationpasses 5-dontu ...

  5. 不错的JS

    http://www.17sucai.com/preview/47509/2013-10-18/Sequence-master/photo-stack/index.html

  6. 基于jQuery实现的水平和垂直居中的div窗口

    在建立网页布局的时候,我们经常会面临一个问题,就是让一个div实现水平和垂直居中,虽然好几种方式实现,但是今天介绍时我最喜欢的方法,通过css和jQuery实现.   1.通过css实现水平居中: 复 ...

  7. Quartz 2D官方文档翻译(持续更新中)

    转换  核心绘图模型定义了两个完全独立的坐标空间:用户空间,一个是代表文档页,和设备空间,另外一个代表本机设备的分辨率.用户空间坐标是与设备空间中像素分辨率无关的浮点数字.当你想要打印或者显示你的文档 ...

  8. FPGA开发(3)

    转载 榨干FPGA片上存储资源 记得Long long time ago,特权同学写过一篇简短的博文<M4K使用率>,文章中提到了Cyclone器件的内嵌存储块M4K的配置问题.文中提到了 ...

  9. 浅谈C中的指针和数组(七)

    现在到揭露数组名本质的时候了,先给出三个结论: (1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组: (2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量: ( ...

  10. php 大数组的POST问题解决

    服务器的PHP.ini的设置问题max_input_vars太小.