問題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位址一起使用。二...