1. 程式人生 > >洛谷 P1061 Jam的計數法

洛谷 P1061 Jam的計數法

阿拉伯 space ora 依次 () sticky 科學 main lan

P1061 Jam的計數法

題目描述

Jam是個喜歡標新立異的科學怪人。他不使用阿拉伯數字計數,而是使用小寫英文字母計數,他覺得這樣做,會使世界更加豐富多彩。

在他的計數法中,每個數字的位數都是相同的(使用相同個數的字母),英文字母按原先的順序,排在前面的字母小於排在它後面的字母。我們把這樣的“數字”稱為Jam數字。在Jam數字中,每個字母互不相同,而且從左到右是嚴格遞增的。每次,Jam還指定使用字母的範圍,例如,從2到10,表示只能使用{b,c,d,e,f,g,h,i,j}這些字母。如果再規定位數為5,那麽,緊接在Jam數字“bdfij”之後的數字應該是“bdghi”。(如果我們用U、V依次表示Jam數字“bdfij”與“bdghi”,則U<V,且不存在Jam數字P,使U<P<V)。

你的任務是:對於從文件讀入的一個Jam數字,按順序輸出緊接在後面的5個Jam數字,如果後面沒有那麽多Jam數字,那麽有幾個就輸出幾個。

輸入輸出格式

輸入格式:

輸入有2行,第1行為3個正整數,用一個空格隔開:

s t w (其中s為所使用的最小的字母的序號,t為所使用的最大的字母的序號。w為數字的位數,這3個數滿足:1≤s<T≤26, 2≤w≤t-s )

第2行為具有w個小寫字母的字符串,為一個符合要求的Jam數字。

所給的數據都是正確的,不必驗證。

輸出格式:

輸出最多為5行,為緊接在輸入的Jam數字後面的5個Jam數字,如果後面沒有那麽多Jam數字,那麽有幾個就輸出幾個。每行只輸出一個Jam數字,是由w個小寫字母組成的字符串,不要有多余的空格。

輸入輸出樣例

輸入樣例#1: 復制
  2 10 5
  bdfij
輸出樣例#1: 復制
bdghi
bdghj
bdgij
bdhij
befgh

說明

NOIP 2006 普及組 第三題

思路:先從低位往高位找到一個可以加的位數,然後把後面的數變為前面那個數加1。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
string s;
int a[26]; int a1,a2,w; bool add(){ int g=0; for(int i=1;i<=w;i++) if(a[i]!=a2-i+1){ g=i; break;} if(g==0) return true; a[g]++; for(int i=g-1;i>=1;i--) a[i]=a[i+1]+1; return false; } void write(){ for(int i=w;i>1;i--) printf("%c",a[i]+97+a1-1); printf("%c\n",a[1]+97+a1-1); } int main(){ scanf("%d%d%d\n",&a1,&a2,&w); a2-=a1;cin>>s; for(int i=w-1;i>=0;i--) a[w-i]=s[i]-97-a1+1; for(int i=1;i<=5;i++){ if(add()) break; write(); } }

洛谷 P1061 Jam的計數法