codevs 1140 Jam的計數法

2021-08-03 14:06:57 字數 1876 閱讀 2812

題目描述 description

jam是個喜歡標新立異的科學怪人。他不使用阿拉伯數字計數,而是使用小寫英文本母計數,他覺得這樣做,會使世界更加豐富多彩。在他的計數法中,每個數字的位數都是相同的(使用相同個數的字母),英文本母按原先的順序,排在前面的字母小於排在它後面的字母。我們把這樣的「數字」稱為

jam數字。在

jam數字中,每個字母互不相同,而且從左到右是嚴格遞增的。每次,

jam還指定使用字母的範圍,例如,從2到

10,表示只能使用

這些字母。如果再規定位數為

5,那麼,緊接在

jam數字「

bdfij

」之後的數字應該是「

bdghi

」。(如果我們用u、

v依次表示

jam數字「

bdfij」與「

bdghi」,則

u,且不存在

jam數字p,使

u)。你的任務是:對於從檔案讀入的乙個

jam數字,按順序輸出緊接在後面的5個

jam數字,如果後面沒有那麼多

jam數字,那麼有幾個就輸出幾個。

輸入描述 input description 有

2行,第1行為

3個正整數,用乙個空格隔開:

s t w

(其中s為所使用的最小的字母的序號,

t為所使用的最大的字母的序號。

w為數字的位數,這

3個數滿足:1≤

s≤26, 2≤w

≤t-s )

第2行為具有

w個小寫字母的字串,為乙個符合要求的

jam數字。

所給的資料都是正確的,不必驗證。

輸出描述 output description

最多為5行,為緊接在輸入的

jam數字後面的5個

jam數字,如果後面沒有那麼多

jam數字,那麼有幾個就輸出幾個。每行只輸出乙個

jam數字,是由

w個小寫字母組成的字串,不要有多餘的空格

這道題一上來的思路肯定是26的26次方列舉,顯然是要超時的,所以我想了乙個小優化,就輕鬆ac了。

我們可以倒著進行dfs,列舉w-1位+乙個新數字時能否成為下乙個,如果不夠可以繼續列舉w-2位+2個新數字時能否成為下乙個,以此類推。但是如果前面w-k這個串和原來的w-k是一樣的,那麼還要判斷新產生的下乙個數字要比原來的那本來的一位大,所以這時我們可以使用dfs(s,0/1)表示當前的串為s,0表示現在的串s與之前不一樣了,所以就可以直接以現在的串s最後一位大的開始列舉,如果是1,表示現在的串s和之前的一樣,那麼從比現在的串s最後一位大開始列舉時,還要注意比原來這一位的數字大。

下附ac**。

#include#include#include#includeusing namespace std;

int s,t,w;

queueans;

string alpha=" abcdefghijklmnopqrstuvwxyz";

string model;

string test[30];

char pos[30];

int cnt=0;

void dfs(string now,int num)

if(now.size()>=w)

if(num==1)

return;

} else

return;

} return;

}string res[10];

int main()

for(int i=w-1;i>=1;i--)

for(char i=pos[1]+1;i<=alpha[t];i++)

while(!ans.empty())

{ cout<

Codevs 1140 Jam的計數法

jam是個喜歡標新立異的科學怪人。他不使用阿拉伯數字計數,而是使用小寫英文本母計數,他覺得這樣做,會使世界更加豐富多彩。在他的計數法中,每個數字的位數都是相同的 使用相同個數的字母 英文本母按原先的順序,排在前面的字母小於排在它後面的字母。我們把這樣的 數字 稱為jam數字。在jam數字中,每個字母...

Jam的計數法(codevs 1140)

題目描述 description jam是個喜歡標新立異的科學怪人。他不使用阿拉伯數字計數,而是使用小寫英文本母計數,他覺得這樣做,會使世界更加豐富多彩。在他的計數法中,每個數字的位數都是相同的 使用相同個數的字母 英文本母按原先的順序,排在前面的字母小於排在它後面的字母。我們把這樣的 數字 稱為j...

1140 Jam的計數法

2006年noip全國聯賽普及組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 jam是個喜歡標新立異的科學怪人。他不使用阿拉伯數字計數,而是使用小寫英文本母計數,他覺得這樣做,會使世界更加豐富多彩。在他的計數法中,每個數字的位數都是相同的 使用相同個數的字母...