題目鏈結p1246 編碼
如果給出的字串字母不遞增,則輸出 \(0\) ,否則輸出對應編號。
首先資料範圍很小。先簡單算一下,用組合數計算出每乙個長度能編號的字串數目。
把 \(6\) 個組合數加起來編號就是 \(313911\) ,即最後乙個字串 \(\mathrm\) 的編號,完全可以列舉每乙個可以編號的字串,找到匹配的就輸出編號即可,否則輸出 \(0\)。
#include #define for(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
char s[10],test[10];//s記錄詢問的字串,test記錄嘗試的字串
int n,id; //n記錄詢問字串長度,id為編號
//last記錄前乙個字母,step記錄遞迴層數,列舉下一位
void dfs(char last, int step)
}dfs(i,step-1);
}}signed main()
這題如果資料量較大可以用組合數學解決。我們先算出長度為 \(1\)~ \(n-1\) 的能編號字串的總數,最後再解決長度為 \(n\) 的字串情況。涉及的細節可能比較多,我盡可能注釋了。
#include #define for(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
char s[10];//ch記錄詢問的字串
int n,id,c[30][30]; //n記錄詢問字串長度
signed main()
id += c[26][i]; //從26個字母中選i個,一定可以排成遞增的字串
}int j ;
for(i,1,n)
cout
}
洛谷P1246編碼問題 排列組合,分類討論
編碼問題 題意就是a,b,c.ab.編碼,給你乙個字串,輸出這是第幾個 這裡可以用暴力列舉,但也可以用組合數學的高超知識 既然這樣我就說一下排列組合的方法,如果要弄乙個 各位數字遞增的三位數,只需要在乙個有序數列裡面取三個數字,此時就無需關注順序,因為順序只能是公升序的。比如0 1 2 3 4 5 ...
編碼 組合數學的應用
本題的思路需要組合數學,即排列組合中的組合,我們熟悉的 c幾幾 一致,cn m m m n n 中的函式int c int m,int n 即為計算組合數的函式。先判斷輸入是否合法 for int i 0 i 如果輸入不合法,即字串中的字元不是按照遞增序排列的,直接輸出0並return。變數ans用...
組合數學 牡牛和牝牛
約翰要帶 n 只牛去參加集會裡的展示活動,這些牛可以是牡牛,也可以是牝牛。牛們要站成一排,但是牡牛是好鬥的,為了避免牡牛鬧出亂子,約翰決定任意兩隻牡牛之間至少要有 k 只牝牛。請計算一共有多少種排隊的方法,所有牡牛可以看成是相同的,所有牝牛也一樣,答案對 5000011 取模。輸入格式 一行,輸入兩...