hdu4741
2013年兩場網(wǎng)絡(luò)賽已經(jīng)過了,之前的現(xiàn)場賽拿了多次銅牌,而這兩場網(wǎng)絡(luò)賽我們都表現(xiàn)得這么水,不由得感慨起來,ACM競賽生涯就要畫上句號了,甚至整個學(xué)習(xí)生涯中這種純學(xué)術(shù)的競賽都要完了。這兩場網(wǎng)絡(luò)表現(xiàn)得不好,痛定思痛,當(dāng)然主要原因是我自己的水平太弱了,技不如人當(dāng)然慘敗了。賽后看各種報告和代碼比較后也發(fā)現(xiàn)了,也許弱校弱的地方并不都是我們不夠聰明和努力吧。所以這里我要特別吐槽一些地方。
第一,我覺得學(xué)校本身投入度不夠,和如今一些學(xué)校的教育目標(biāo)和方式不是特別好。我有一萬次想寫信給校長,但是又怕文采不好起不了反應(yīng)或者文章感情過于激昂惹來禍端,要是給記個過,就虧大了。為什么我覺得學(xué)校本應(yīng)該是無私教學(xué)育人的,而學(xué)校很多時候做得像投資一樣?比如,我真心選修一些高質(zhì)量理學(xué)公共課程,諸如離散數(shù)學(xué)之類而學(xué)校沒有,連高等數(shù)學(xué)、線性代數(shù)、概率論這樣老師大都是直接教怎么解題、記公式背公式。連物理這樣美妙的學(xué)科最后竟然成了跟毛概一樣的東西,shit!我就不懂了,為什么大學(xué)物理和物理實驗、概率論應(yīng)該還是屬于“閹割”版的。有時候,很認真做物理實驗或者其他計算機實驗的,也不知道老師們仔細看了報告了沒有。最讓人抓狂的是,也許在所有人都沒有意識的時候,也許改你作業(yè)的是個水平菜得像個鳥一樣的研究生,然后你改進了老師給的標(biāo)準(zhǔn)算法,他一個看不懂,這次作業(yè)就算交過了、剛剛及格!好了,說點重點吧,學(xué)校的理學(xué)諸如數(shù)學(xué)、物理這樣的學(xué)科太弱,其他地方再好能好到哪里去,好景又能有多長。完全只懂工科畢業(yè)的同學(xué),工作能力能勝過普通社會青年和農(nóng)民大叔多少,甚至很多地方還要欠缺很多吧。而一些領(lǐng)導(dǎo)者卻認為,短期看不到成效的教學(xué)投資不值得!
第二,首先我還是想特別感謝一下我的教練,我覺得他的才華、智慧是毋庸置疑的,而且我覺得他在教學(xué)育人上是個特別有思想值得敬愛的老師。剛大一、甚至到大二的時候,我都還在之前的象牙塔里。到了大三,開始要全部投入進來。很幸運,第一次參加現(xiàn)場賽拿到了獎牌,可能是太緊張了,不然那時候真的可以拿到一個銀牌。但是后面的路確實苦澀。有時候,很多算法并不像一般的算法那樣來源于實際,容易吸收。特別是跟數(shù)學(xué)(離散數(shù)學(xué))有關(guān)的,如果是第一次見到的,那就完全只能看了。而解決的辦法只有一個——刷題!然后看各種不知道是不是原創(chuàng)的報告,各種猜各種若無邊際的驗證,(almost all on your own).
好吧,還是回到主題吧。這道題的大意是給空間上兩條直線,(每條直線給出兩個點的坐標(biāo),軸坐標(biāo)范圍+-10^4)求公垂線段的長度及其兩端點坐標(biāo)。
雖然這道題彈了30+次,我還是很想說說我的思路。
假設(shè)F是AB上的垂足,E是CD上的垂足。將AB向兩端擴展,保證F會在AB中間,CD也是類似。
然后三分在線段AB上取點X,在F附近的X能讓|XD|+|CX|。對CD也是同樣。
這樣算得Xab,Xcd。由于AB、CD被擴展了,所以這次的Xab、Xcd只能是粗略估計。
假設(shè)粗略估計的精度是0.1,那么以Xab為起點往AB兩個方向擴展1個單位長度得到新的AB,對Xcd也是同樣。
再次進行三分搜索答案。
結(jié)果就一直在TLE和WA之間徘徊。因為題目中AB、CD可能重點,是零向量,無法擴展!我真想說臟話,為毛官方的說話搞一個專門的話題板,話題板那么多還不支持搜索,每翻一個頁面等要等10秒!!!同樣的問題,有的回復(fù)了有的沒回復(fù),這不是坑爹嗎?整個過程個,admin一直在說No response,然后強調(diào)注意實際問題。怎么說呢?我承認這是一個能力,但是:第一發(fā)散思維往往是多方向的;另外我們有太多時候被教育要嚴(yán)格遵守描述,?這個時候要我們自主發(fā)揮,會很大程度加大運氣因素而不是算法知識和編程水平較量了!
好了,看了清華ACE的代碼,理了一下思路。可讀性還是挺好,重寫了一下。求公共垂線段長還是很容易的,但是有個地方還是不理解。求路過的大神指教一下。
貼個代碼:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<vector> 6 #include<algorithm> 7 using namespace std; 8 struct point{ 9 double x,y,z; 10 point(double p1=0,double p2=0,double p3=0){ x=p1,y=p2,z=p3; } 11 void getAX(){ scanf("%lf%lf%lf",&x,&y,&z); } 12 void putAX(){ printf("%.6f %.6f %.6f",x,y,z); } 13 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)); } 14 point operator-(point B){ return point(x-B.x,y-B.y,z-B.z); } 15 point operator+(point B){ return point(x+B.x,y+B.y,z+B.z); } 16 point operator*(double rat){ return point(x*rat,y*rat,z*rat); } 17 point cross(point B){ return point(y*B.z-z*B.y,z*B.x-x*B.z,x*B.y-y*B.x); } 18 double dot(point B) { return x*B.x+y*B.y+z*B.z; } 19 void normalize(){ (*this)=(*this)*(1/this->getdist()); } 20 point normal(){ return (*this)*(1/this->getdist()); } 21 }; 22 point A,B,C,D,k1,k2; 23 int main() 24 { 25 int cases; cin>>cases; 26 for(int cas=1;cas<=cases;cas++){ 27 A.getAX(); B.getAX(); 28 C.getAX(); D.getAX(); 29 point AB=B-A,CD=D-C; 30 point ver=AB.cross(CD); 31 ver.normalize(); 32 double len=(C-A).dot(ver); 33 printf("%.6f\n",fabs(len)); 34 ver = ver*len; 35 //*********神算法,不理解*************** 36 k1=AB.normal(), k2=CD.normal(); 37 point AC=C-A; 38 point k1_k2=k1+k2; 39 double t1=AC.dot(k1_k2)/(k1_k2.getdist()*k1_k2.getdist()); 40 k1_k2=k1-k2; 41 double t2=AC.dot(k1_k2)/(k1_k2.getdist()*k1_k2.getdist()); 42 point F=A+k1*(t1+t2); 43 point E=C-k2*(t1-t2); 44 //************************************** 45 F.putAX(); printf(" "); 46 E.putAX(); printf("\n"); 47 } 48 return 0; 49 } View Code
?
轉(zhuǎn)載于:https://www.cnblogs.com/karlvin/p/3324145.html
總結(jié)
- 上一篇: HDU 4031 Attack (线段树
- 下一篇: 超越IEtab、网银支付助手,无需再次登