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的代碼,理了一下思路。可讀性還是挺好,重寫了一下。求公共垂線段長還是很容易的,但是有個地方還是不理解。求路過的大神指教一下。
貼個代碼:
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
?
轉載于:https://www.cnblogs.com/karlvin/p/3324145.html
總結
- 上一篇: HDU 4031 Attack (线段树
- 下一篇: 超越IEtab、网银支付助手,无需再次登