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. poj - 4045 - Power Station

    题意:一棵有n个结点的树,要取其中的一个结点,使得该结点到其他所有结点的距离和dis最小,即损耗I * I * R * dis最小,输出最小损耗和该结点(有多个的话按结点编号从小到大输出)(3 < ...

  2. js的this几种用法

    1.普通的函数调用 此时指的是全局对象 function aaa(){ this.x=1;}aaa();alert(x) 2.对象内的方法this调用 此时指的是上一级对象 var aaa={ zz: ...

  3. Python核心编程读笔 13:执行环境

    第14章  执行环境 一.可调用对象 python有四种可调用对象:函数.方法.类.一些类的实例 1 函数 (1)内建函数(BIF) BIF是用c/c++写的,编译后放入python解释器,然后把它们 ...

  4. JVM学习之类的卸载机制

    类的生命周期 当Sample类被加载.连接和初始化后,它的生命周期就开始了,当代表Sample类的Class对象不再被引用,即不可触及时,Class对象就会结束生命周期,Sample类在方法区内的数据 ...

  5. Android 通过HTTPCLINET GET请求互联网数据

    private EditText et; private TextView tv; HttpClient client; @Override protected void onCreate(Bundl ...

  6. Linux网络管理——子网掩码

    1. 网络基础 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB",&q ...

  7. javascript自定义日期函数

    1.格式化日期(YYYY-MM-DD) 代码: var DateFormat = function (date) { if (!(date instanceof Date)) { date = dat ...

  8. 编译SASS

    编译SASS sass编译有很多种方式,如命令行编译模式.sublime插件SASS-Build.编译软件koala.前端自动化软件codekit.Grunt打造前端自动化工作流grunt-sass. ...

  9. java面向对象之 多态 Polymorphism

    多态(Polymorphism):用我们通俗易懂的话来说就是子类就是父类(猫是动物,学生也是人),因此多态的意思就是:父类型的引用可以指向子类的对象. 1.多态的含义:一种类型,呈现出多种状态 主要讨 ...

  10. C语言Printf格式

    使用printf打印时发现,如果数据类型和打印使用的类型不一致,结果就是混乱的. 这是因为printf本身并不进行数据的类型转换,他只是把输入按照给定的数据格式输出,如果二者不匹配,那么由于不同数据类 ...