比賽一開始,首先看題,第一題,是一道數論的題,想了幾下,發現沒有水到我能作的地步,跳過;而後是第二題,之前應該見過,可是沒有作出來,想了幾分鐘,沒有結果,以後Hogg大牛說是作過的一道DP。。。。。。DP無感,跳過;而後第三題,我比較熟悉的計算幾何,想一想是比較水的,並且幾個計算公式也有(居然最後杯具了。。。),還提醒一下Hogg大牛作完第二題能夠去看看這題。。。。。。而後想着先看完全部題目再以爲作題順序,最後一題看了一下,想一想也許能夠試着暴力(在後面Hogg大牛成功暴力出結果),而後就開始了杯具的第三題,先從模板開始找,找到了幾個公式,發現居然很短,瞬間暗爽了一下,而後快速開敲,誰知運行以後發現居然錯了。。。。而後開始找錯(模板沒有用過,也有點擔憂),而後一直找啊找啊找啊找,最後一次次檢查模板,而後把整個模板的過程都本身證實了一遍,角度弧度的轉化也想了幾遍,仍是沒有找出結果,就這樣一直耗着時間,必定要死磕出來(由於過程仍是比較隨意的,不須要模擬省賽的過程),而後一直調試,全部結果都被輸出了,並且因爲給出的樣例涉及到了三維的球體,本身手算仍是很難的,因此過了好久不得已才手算了樣例,但是依舊於事無補。。。知道最後也沒有找出bug,看了別人代碼才發現是角度轉弧度出了錯,漏了個PI,我還從不一樣的角度想了想我有沒有轉化錯誤。。。。。坑啊,真有揍死本身的想法。。。。兩天後改了成功AC。。。。。。編程
總結:網站
果真沒有用過的模板仍是會有點危險,以後的比賽要慎重選擇是否真的要用不熟悉的模板;spa
計算幾何真的比較多細節,並且彷佛幾回作的都是幾何+圖論相結合(不知道省賽是否是也會如此),真的須要找多我的結隊編程,幫我找錯才行,否則到時候怕會栽在這上面;設計
看來我是須要一個好的狀態才能A出題,因此慎重選擇主攻的題目,並且在卡題的時候應該作到什麼程度適宜,真的要好好研究一番。調試
附上1003代碼,謹記教訓:code
1 /* 2 題解:球面的兩點距離+最小生成樹 3 */ 4 #include <cstdio> 5 #include <cmath> 6 #include <cstring> 7 8 #define VERMAX 105 9 #define MAXDOU 30000000.0 10 const double pi= 3.14159265358979323846; 11 12 using namespace std; 13 14 struct point 15 { 16 double x,y,z; 17 }s[105]; 18 19 int n; 20 21 double gra[105][105]; 22 23 double prim(int n) 24 { 25 bool vis[VERMAX]; 26 double low[VERMAX]; // 一直記錄着已訪問點集中到i點的最小距離 27 int pos = 0; // 隨意選取開始的結點位置 28 memset(vis,false,sizeof(vis)); 29 vis[pos] = true; 30 31 double ret = 0; 32 for(int i=0; i<n; i++) // 初始化 33 low[i] = gra[pos][i]; 34 for(int i=1; i<n; i++) // n-1次求解出剩餘的n-1個結點 35 { 36 double min = MAXDOU; 37 for(int j=0; j<n; j++) // 該點集從1開始,共有n個點 38 { 39 if (!vis[j] && low[j] < min) 40 { 41 min = low[j]; 42 pos = j; 43 } 44 } 45 ret += min; 46 vis[pos] = true; 47 for(int j=0; j<n; j++) 48 if (!vis[j] && low[j] > gra[pos][j]) 49 low[j] = gra[pos][j]; 50 } 51 return ret; 52 } 53 54 int main(void) 55 { 56 int t; 57 scanf("%d",&t); 58 while (t--) 59 { 60 double R,l; 61 scanf("%lf%lf%d",&R,&l,&n); 62 R /= 2.0; 63 for(int i=0; i<n; i++) 64 { 65 double lambda,phi; 66 scanf("%lf%lf",&phi,&lambda); 67 phi = phi * pi / 180.0; 68 lambda = lambda * pi / 180.0; 69 s[i].x = cos(phi)*cos(lambda); 70 s[i].y=cos(phi)*sin(lambda); 71 s[i].z=sin(phi); 72 } 73 74 for(int i=0; i<n; i++) 75 for(int j=0; j<n; j++) 76 gra[i][j] = MAXDOU; 77 78 for(int i=0; i<n; i++) 79 for(int j=i+1; j<n; j++) 80 { 81 double A = acos(s[i].x * s[j].x + s[i].y * s[j].y + s[i].z * s[j].z); 82 gra[i][j] = A*R; 83 gra[j][i] = A*R; 84 } 85 double c = prim(n); 86 if (c <= l) 87 printf("Y\n"); 88 else 89 printf("N\n"); 90 } 91 return 0; 92 }