cumtoj 子網掩碼 CUMTOJ演算法實驗四

2021-10-13 04:40:43 字數 3257 閱讀 7854

問題a日期格式太簡單,就不寫了,有手就行

問題c2n皇后問題嫌麻煩,emm,我比較懶,罷了罷了問題 b: 哈夫曼編碼

題目描述

給定乙隻含有小寫字母的字串;輸出其哈夫曼編碼的長度

輸入第一行乙個整數t,代表樣例的個數,接下來t行,每行乙個字串,0

輸出對於每個字串,輸出其哈夫曼編碼長度

樣例輸入

3 hrvsh lcxea***dphiopd mntflolfbtbpplahqolqykrqdnwdoq

樣例輸出

10 51 115

首先關於哈夫曼編碼長度,以題目中的資料舉例,hrvsh的頻次為1112,作出樹可得如下:

有兩種畫樹的方法,算出來的長度都為10

這裡就有了一種我也不知道為什麼但是就是很nb的演算法:

在程式設計實現時,可以使用priority_queue實現,這是乙個優先佇列,每次push之後可以自動排序(記得包含標頭檔案 #include)

定義方法如下:

priority_queue ,greater > a;    //公升序佇列

priority_queue ,less >a;        //降序佇列

使用方法和queue幾乎一樣:

top 訪問隊頭元素

push 插入元素到隊尾然後排序

pop 彈出隊頭元素

**如下:#include

#include

#include

using namespace std;

int main()

int n;

cin>>n;

while(n--);

for (int i=0;i

weight[int(a[i])-96]++;

priority_queue,greater >q;

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

if (weight[i]>0)

q.push(weight[i]);

while(q.size()>=2)

int x,y;

x=q.top();

q.pop();

y=q.top();

q.pop();

sum+=x+y;

q.push(x+y);

cout<

題目描述

給定無向連通圖g和m種不同的顏色,用這些顏色給圖的各個頂點著一種顏色,若某種方案使得圖中每條邊的2個頂點的顏色都不相同,則是乙個滿足的方案,找出所有的方案。

輸入第一行有3個正整數n,k和m,分別表示n個頂點,k條邊,m種顏色

接下來k行,每行2個正整數,表示一條邊的兩個頂點

輸出所有不同的著色方案數

樣例輸入

5 8 4

1 21 3

1 42 3

2 42 5

3 44 5

樣例輸出

這個先選取乙個顏色,找能填充的所有點,完成一遍之後記得重置點的顏色

**如下:#include

using namespace std;

int n,k,m,sum=0;

int color[20000];

int connect[2000][2000];

void dfs(int d)

if(d==n+1)

sum++;

return;

for (int i=1;i<=m;i++)  //迴圈顏色

bool flag=1;

for (int j=1;j<=n;j++)

if (connect[d][j]&&color[j]==i)

flag=0;

break;

if (flag)

color[d]=i;

dfs(d+1);

color[d]=0;

int main()

cin>>n>>k>>m;

for (int i=0;i

int tmp1,tmp2;

cin>>tmp1>>tmp2;

connect[tmp1][tmp2]=1;

connect[tmp2][tmp1]=1;

dfs(1);

cout<

return 0;

}問題 e: 部分和問題

題目描述

給定n個整數,判斷是否可以從中選擇若干數字,使得他們的和恰好為k。

輸入多組測試用例。

對於每組測試用例,第一行乙個正整數n,第二行n個整數,第三行乙個整數k。

1≤n≤20,輸入整數及k均小於1e8。

輸出若可以使得和為k,輸出」yes」,否則」no」。

樣例輸入

4 1 2 4 7 13

樣例輸出

yes乙個標準的dfs,看**能直接看懂

但是要注意一點,這個return dfs(l+1,sum)||dfs(l+1,sum+a[l]);

這其中的||的含義是短路或運算子,如果前面為true就不判斷後面的了

類似還有

&&:短路與運算子,如果前面為false就不判斷後面的了

**如下:#include

using namespace std;

int n,a[25],k;

bool dfs(int l,int sum)

if (sum==k)

// cout<

return true;

if (l==n)

//cout<

return false;

else

// cout<

return dfs(l+1,sum)||dfs(l+1,sum+a[l]);

int main()

while (cin>>n)

for (int i=0;i

cin>>a[i];

cin>>k;

if (dfs(0,0))

cout<

else

cout<

為了更好的理解**,被注釋掉的加粗部分可以顯示程式的演算法路徑,用6表示成功,4表示失敗,1表示繼續

在輸入為1 2 4 7時,輸出了如下

該問題先走右兒子,做出樹如下:

每乙個1代表了往下走了一步,遇到4就回退,一直到6畫的好醜啊

return true和return false其實只能return給return dfs(l+1,sum)||dfs(l+1,sum+a[l])語句

再由這句命令return給main

也可以看到如果一旦有true就會停止搜尋,這又回到了||的作用

子網掩碼取反怎麼取 子網掩碼

子網掩碼是乙個32位位址,是與ip位址結合使用的一種技術。它的主要作用有兩個,一是用於遮蔽ip位址的一部分以區別網路標識和主機標識,並說明該ip位址是在區域網上,還是在遠端網上。二是用於將乙個大的ip網路劃分為若干小的子網路。使用子網是為了減少ip的浪費。因為隨著網際網路的發展,越來越多的網路產生,...

4 2 3 子網掩碼

網際網路是由許多小型網路構成的,每個網路上都有許多主機,這樣便構成了乙個有層次的結構。ip位址在設計時就考慮到位址分配的層次特點,將每個 ip位址都分割成網路號和主機號兩部分,以便於 ip位址的定址操作。此時,需要用某種方法指定哪些位是網路號,哪些是主機號,這個任務就是由子網掩碼來承擔的。子網掩碼不...

子網掩碼詳解

一 子網掩碼的概念及作用 子網掩碼 subnet mask 又叫網路掩碼 位址掩碼 子網路遮罩,是乙個應用於tcp ip網路的32位二進位制值。它可以遮蔽掉ip位址中的一部分,從而分離出ip位址中的網路部分與主機部分,基於子網掩碼,管理員可以將網路進一步劃分為若干子網。它必須結合ip位址一起使用。二...