杭電2018複試上機真題

2021-09-13 04:06:36 字數 3278 閱讀 6630

ps:題是別的地方copy過來的,**是自己的

第一題:

}第二題:

注:19上機也出了類似的題,本身這種題屬於計算機影象處理,我本科沒做過這方向,不是很了解,個人感覺弄懂對於考試意義不大,所以我也不深究了。

第三題:

瓜農王大爺去年種西瓜賺了不少錢。看到收入不錯,今年他又重新開闢了n個西瓜地。 

為了能給他的n個西瓜地順利的澆上水,對於每個西瓜地他可以選擇在本地打井,也可以修管道從另乙個瓜地(這個瓜地可能打了井;也可能沒打井,他的水也是從其他瓜地引來的)將水引過來。 

當然打井和修管道的費用有差別。已知在第i個西瓜地打井需要耗費wi元,在第i、j個西瓜地之間修管道需要耗費pi,j元。 

現在的問題是:王大爺要想使所有瓜地都被澆上水,至少需要花費多少錢(打井與修管道的費用和)? 

由於瓜地較多,王大爺無法選擇在哪些(個)瓜地打井,哪些西瓜地之間修管道。 

請你程式設計幫王大爺做出決策,求出最小費用。

(1<=n<=300,1<=wi<=100000;pi,i=0,1<=pi,j=pj,i<=100000)

input

第1行,乙個正整數n,代表西瓜地的數量。 

以下n行,依次給出整數w1..wn(每塊西瓜地的打井費用)。 

緊接著是乙個n*n的整數矩陣,矩陣的第i行第j列的數代表pi,j(兩塊西瓜地之間建立管道的費用)。每行的兩個數之間有乙個空格隔開。

654

43120

0 2 2 2 9 9

2 0 3 3 9 9

2 3 0 4 9 9

2 3 4 0 9 9

9 9 9 9 0 9

9 9 9 9 9 0

output

19
在第4個瓜地打井(費用為3),然後將第2,3,4個瓜地與第1個瓜地間修管道(費用分別是2,2,2),這樣水可以經過管道從4流向1,然後經1再流向2和3; 

在第5個瓜地打井(費用為1),5和6之間修管道(費用為9)。 

這樣一共打了2口井,修了4條管道,能給所有的6個瓜地澆水,費用是:3+2+2+2+1+9=19。 

//最小生成樹

/* 這裡用了個巧辦法。對於最典型的最小生成樹來說,我一般用並查集以及邊集來解決,並查集用來把通過最小邊連起來的點進行合集,邊集用來遍歷最小邊,點集的話用樹的雙親表示法來表示,以便於表示自己的根結點。這題就是多了乙個井的代價,巧辦法就是,我可以把井也當做乙個點,點的權值就相當於這個多出來的點到打井結點的路徑長度,這樣就把所有點權值轉化為邊權值,就是最小生成樹的經典演算法了。

eg:看例子,有六個點,點權值分別為5,4,4,3,1,20,這時我們新加乙個點,這個點到所有結點路徑權值為點權值,加入我們的邊集,相當於在原來基礎上,又新加了6條邊,這樣就可以正常實現kruskal演算法。

*/#include#includeusing namespace std;

int tree[100];//雙親表示法的樹,存放自己的雙親結點編號,-1則自身為根,初始所有結點都是-1

struct point;

struct edge;

int find(int x)

else}/*

不加入路徑壓縮,好理解一些

int find(int x)

*/bool cmp(edge a,edge b)

int main()

edge e[1000];

int enum = 0;

int tmp;

for(int i = 1;i <= num;i++)

else if(i > j)

scanf("%d",&(e + enum)->cost);

(e + enum)->from = i;

(e + enum)->to = j;

enum++;

} }//點權值轉化為邊權值,放入邊集

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

sort(e,e + enum,cmp); //邊權值排序

for(int i = 0;i < num + 1;i++)

//基於kruskal的最小生成樹演算法

int sum = 0;

for(int i = 0;i < enum;i++) }

printf("%d\n",sum);

return 0;

}

杭電2011複試上機真題

ps 題是別的地方copy過來的,是自己的 第一題 輸入三個正整數a b c。判斷這三個數能不能構成乙個三角形。組成三角形的三條邊a,b,c需同時滿足條件 a b c a c b b c a 而實際上只要最長邊小於其餘兩邊之和即可 include includeusing namespace std...

杭電2012複試上機真題

ps 題是別的地方copy過來的,是自己的 第一題 輸入乙個十進位制的數,把它轉成十六進製制。leetcode 168 171 26進製轉換成10進製 這裡我輸入int輸出char include 二進位制 十六進製制 0 0 16 10 256 100 int main while scanf d...

杭電2016複試上機真題

ps 題是別的地方copy過來的,是自己的 第一題 判斷乙個數n是否是素數,是的話輸出 yes 否則輸出 no 素數 除了1和自身以外,沒辦法被其它自然數整除的數 即質數,0和1不在討論範疇內 輸入 1000000007 100 輸出 yes no include includeint main i...