題目描述 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是個喜歡標新立異的科學怪人。他不使用阿拉伯數字計數,而是使用小寫英文本母計數,他覺得這樣做,會使世界更加豐富多彩。在他的計數法中,每個數字的位數都是相同的 使用相同個數的字母...