2014 攜程編程資格賽總結

比賽一開始,首先看題,第一題,是一道數論的題,想了幾下,發現沒有水到我能作的地步,跳過;而後是第二題,之前應該見過,可是沒有作出來,想了幾分鐘,沒有結果,以後Hogg大牛說是作過的一道DP。。。。。。DP無感,跳過;而後第三題,我比較熟悉的計算幾何,想一想是比較水的,並且幾個計算公式也有(居然最後杯具了。。。),還提醒一下Hogg大牛作完第二題能夠去看看這題。。。。。。而後想着先看完全部題目再以爲作題順序,最後一題看了一下,想一想也許能夠試着暴力(在後面Hogg大牛成功暴力出結果),而後就開始了杯具的第三題,先從模板開始找,找到了幾個公式,發現居然很短,瞬間暗爽了一下,而後快速開敲,誰知運行以後發現居然錯了。。。。而後開始找錯(模板沒有用過,也有點擔憂),而後一直找啊找啊找啊找,最後一次次檢查模板,而後把整個模板的過程都本身證實了一遍,角度弧度的轉化也想了幾遍,仍是沒有找出結果,就這樣一直耗着時間,必定要死磕出來(由於過程仍是比較隨意的,不須要模擬省賽的過程),而後一直調試,全部結果都被輸出了,並且因爲給出的樣例涉及到了三維的球體,本身手算仍是很難的,因此過了好久不得已才手算了樣例,但是依舊於事無補。。。知道最後也沒有找出bug,看了別人代碼才發現是角度轉弧度出了錯,漏了個PI,我還從不一樣的角度想了想我有沒有轉化錯誤。。。。。坑啊,真有揍死本身的想法。。。。兩天後改了成功AC。。。。。。編程

 

總結:網站

果真沒有用過的模板仍是會有點危險,以後的比賽要慎重選擇是否真的要用不熟悉的模板;spa

計算幾何真的比較多細節,並且彷佛幾回作的都是幾何+圖論相結合(不知道省賽是否是也會如此),真的須要找多我的結隊編程,幫我找錯才行,否則到時候怕會栽在這上面;設計

看來我是須要一個好的狀態才能A出題,因此慎重選擇主攻的題目,並且在卡題的時候應該作到什麼程度適宜,真的要好好研究一番。調試

 

附上1003代碼,謹記教訓:code

攜程全球數據中心建設

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 725    Accepted Submission(s): 307


Problem Description
攜程爲了擴展全球在線旅遊業務,決定在全球建設多數據中心,以便提升網站的訪問速度和容災處理。
爲了實現每一個數據中心的數據能互通,數據中心之間須要經過光纖鏈接。爲了節約光纖成本,咱們計劃採用點對點方式來達到最終各個數據中心的數據互通,每一個數據中心自己均可以做爲數據中轉站。作爲全球多數據中心設計者,您須要知道最短的光纖總長度,來把全部的數據中心都實現互通。假設地球是個圓球,且表面是平滑的,而且沒有任何阻礙物(河流,山脈)。

輸入數據是一組數據中心的經緯度
緯度: -90° 到 +90°
經度: -180° 到 +180°
(圓周率pi= 3.14159265358979323846)
 

Input
第一行第一個整數N(1≤N≤100),表示有多少個用例. 每一個用例包含了:
第一行,小數D(1≤D≤1,000,000),表面圓球的直徑(千米).
第二行,小數L(1≤L≤1,000,000) 光纖總長度 (千米).
第三行,整數C(1≤C≤100) ,表示數據中心的數量.
接下來的C行, 每行有2個形如"X Y"的小數,表示每一個數據中心的緯度(-90≤X≤90)和經度 (-180≤Y≤180).
 

Output
每一個用例輸出一行. 若是光纖長度L足夠鏈接全部數據中心,輸出"Y", 不然輸出"N"。
 

Sample Input
2 12742 5900 3 51.3 0 42.5 -75 48.8 3 12742 620 2 30.266 97.75 30.45 91.1333
 

Sample Output
Y N
 
 
 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 }
相關文章
相關標籤/搜索