谷歌中國演算法比賽解題報告 APAC2016A

2021-07-24 09:35:18 字數 3187 閱讀 2979

problem a.googol string

problem b.gcube

problem c.gcampus

problem d.gsnake

1. 這題不要被10的100次方嚇到了,其實這題思路很簡單,注意長度上s2=s1*2+1,所以先找到第k個數字屬於s幾,然後倒著找,如果數字在倒著的左串就不改變,在右串就等於左串對應位置的數字改變(0變1,1變0),在中間就等於0. 此題得解

2.這個題其實就是求k個數字的乘積的k次方根,因為有精度要求所以暴力解法精度不達標……,那麼該怎麼做呢,求log

利用log2 函式,可以輕鬆解出來。。。這裡要注意stl預設的log是以e為底的,別搞錯了

3.這個題,如果想把每兩個節點的最短路徑都求出來是不可能的,主要因為有可能有很多最短路徑,時間相同但路不同,最典型的,考慮乙個網格,從左上角到右下角有多少不同的最短路徑?

那麼換個思路,其實對任意兩點,求出最短路徑,用floyd 五行搞定,然後對於每條路,如果所需的時間大於最短路徑所需時間,這條路就要刪除,否則不刪除。問題得解

注意題目可能會給先給乙個 1到2有一條耗時為3的路,再給乙個 1到2有一條耗時為4的路,初始化floyd矩陣時要注意取最小值

4.這道題時間來不及(被2017apac虐的太慘,本打算趕在3週內刷完所有apac...但我太高估自己了)

如果能通過apac2017e,我會回來把它補上……(雖然我覺得希望渺茫。。。)

最後 附上**

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define ll long long

class pa

ll k;

int dfs(ll t, ll k)

void singleprocess(ofstream& fout)

int num=dfs(t, k);

fout << num;

} void run()

fclose(fp);

fout.close();

}};class pb

int m, n;

vectordimensions;

vector> queries;

void singleprocess(ofstream& fout)

len = len / (queries[i][1] - queries[i][0] + 1);

len = powl(2, len);

fout << endl << setiosflags(ios::fixed) << setprecision(8) << len;

} }void run()

for (int i = 0; i < m; i++)

fout << "case #" << (time + 1) << ": ";

singleprocess(fout);

fout << endl;

std::cout << time << endl;

} fclose(fp);

fout.close();

}};class pc

int m, n;

vectorefficientroad;

vector> roads;

struct node

};vectorvisited;

vectoroffices;

map> roadnomap;

vector> floydmatrix;

void dfsfindpath(map>& paths, int curr)

}} void dijkstra(int from, int to)

}} visited.clear();

visited.resize(n, 0);

dfsfindpath(paths, to);

} void floyd(ofstream& fout)

for (int i = 0; i < n; i++)

for (int k = 0; k < n; k++)

}} for (int i = 0; i < roads.size(); i++)

}void singleprocess(ofstream& fout)

void run()

fout << "case #" << (time + 1) << ":";

singleprocess(fout);

fout << endl;

std::cout << time << endl;

} fclose(fp);

fout.close();

}};class pd

int r, c;

set> visited;

struct snake

void init(int r, int c)

void moveonestep(set>& visited,int r,int c)

else

}}; void singleprocess(ofstream& fout)

void run()

fclose(fp);

fout.close();

}};int main()

2008湘潭大學程式設計比賽解題報告

blog不能貼附件,有需要題目,測試資料和solution的可以去群空間裡下,或者發email給我。a.排名計算 難度 中等 長度 中 模擬題,主要就是乙個排序,由於測試資料不大,不用快排也不會超時。注意一下排序方法和排名輸出就可以了。b.xtucpc 難度 容易 長度 短 簡單的字串處理,這個題目...

拔河比賽 CODEVS1959 解題報告

題面 將n個數分成兩部分,使其個數之差不超過1,且兩部分和之差最小。n 100,思路 由於觀察到ai很小,所以很容易就想到的乙個思路是以數的大小和個數作二維費用布林揹包,求其當個數為n 1時最接近的解。這是我很早就想到了的,但這道題還是做了很久,因為算下時間複雜度的話可以發現是 所以我就想呀想,想呀...

演算法 棋盤遊戲 game 解題報告

棋盤遊戲 game 源程式名 game.pas,c,cpp 可執行檔名 game.exe 輸入檔名 game.in 輸出檔名 game.out 時限 2s 在乙個4 4的棋盤上有8個黑棋和8個白棋,當且僅當兩個格仔有公共邊,這兩個格仔上的棋是相鄰的。移動棋子的規則是交換相鄰兩個棋子。現在給出乙個初始...