C 演算法之 巧用演算法解決編譯速度

2021-08-21 21:01:31 字數 1766 閱讀 3648

c++ 是一門常用的語言。面對眾多的 c++ **,等待原始檔編譯的漫長時間是個令人糟心的時刻,一直以來大家對此怨聲載道。      

經過一番調查和研究,你發現一些源**之間是有依賴關係的。例如,某個原始檔 a.cpp 編譯鏈結生成了動態鏈結庫 a.dll,而 b.cpp 編譯鏈結生成的 b.dll 依賴於 a.dll。這個時候,必須等待 a.dll 生成之後才能生成 b.dll。為了表達簡單,我們這個時候稱 b.cpp 依賴於 a.cpp。

大長經常能夠使用乙個分布式並行的編譯平台,可以同時編譯多個不互相依賴的檔案,大大提高了源**的編譯速度。然而當某些依賴鏈很長的時候,這個編譯平台也無能為力,只能按照依賴順序乙個乙個完成編譯,從而造成了很長的編譯時間。

為了驗證這個想法,你決定著手通過**分析這些檔案之間的編譯順序。已知這些檔案的檔名,以及這些檔案所依賴的其他檔案,你需要編寫乙個程式,輸出乙個可行的編譯所有原始檔的編譯順序。如果有多種可行的序列,請輸出所有檔名序列中字典序最小的那乙個(序列 (a1, a2, ..., an) 字典序小於序列 (b1, b2, ..., bn),當且僅當存在某個 i ,使得 ai 的字典序小於 bi,並且對於任意 j < i ,都有 aj = bj)。

演算法輸入:

輸入包含多組測試資料。輸入的第一行包含乙個整數 t(t ≤ 100),表示輸入中一共包含有 t 組測試資料。每組測試資料第一行是乙個整數 n(n ≤ 1000),表示一共有 n 個源**檔案。隨後一共有 n 行資料,其中第 i(0 ≤ i < n) 行資料報含序號為 i 的源**檔案的依賴資訊。每一行開頭是乙個字串,表示這乙個檔案的檔名,隨後乙個整數 m(0 ≤ m ≤ n),表示編譯這個原始檔之前需要先編譯 m 個依賴檔案。之後是 m 個整數 j0 ... jm-1,表示這 m 個依賴檔案的序號(0 ≤ j < n) 。所有的檔名僅由小寫字母、數字或「.」組成,並且不會超過 10 個字元。保證 n 個源**檔案的檔名互不相同。

演算法輸出:

對於每一組輸入,按照編譯先後順序輸出一組可行的編譯順序,一行乙個檔名。如果有多種可行的序列,請輸出所有檔名序列中字典序最小的那乙個。如果不存在可行的編譯順序,輸出一行 error。每組測試資料末尾輸出乙個空行。

樣例輸入:

3

2a.cpp 0

b.cpp 1 0

2cb 0

c 02

a.cpp 1 1

b.cpp 1 0

樣例輸出:

a.cpp

b.cppccb

error

#include "stdafx.h"

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

bool isempty(vector> vec)

} return true;

}int main()

}} vectorvstr;

vectorused(n,0);

bool change = false;

while (!isempty(vec))

}if (flag == 0)

used[i] = 1;}}

}if (!change)

}for (auto i : vstr)

cout << endl;

} int a;

cin >> a;

return 0;

}

巧用進製解決天平稱問題《演算法很美》

用天平稱重時,我們希望佣金可能少的砝碼組合稱出盡可能多的重量。如果有無限個砝碼,但它們的重量分別是1,3,9,27,81,等3的指數冪神奇之處在於用它們的組合可以稱出任意整數重量 砝碼允許放在左右兩個盤中 本題目要求程式設計實現 對使用者給定的重量,給出砝碼組合方案,重量 1000000。例如 使用...

C 排序演算法之冒泡演算法

1.冒泡演算法 思想 從第乙個數開始,將相鄰兩個數比較,將小的調到前面。效果 第一趟比較,將最大的移到最後乙個位置 第二趟,將次大的移到倒數第二個位置,以此類推,需要做n 1次迴圈。void bubble sort int a,int n 如果用指標的話,一定要注意陣列名是指標常量,不能修改其值,只...

c 演算法之貪心

一 基本概念 什麼是貪心演算法 貪心演算法 又稱貪婪演算法,greedyalgorithm 是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生...