洛谷P1061 Jam的计数法
題目描述
Jam是個喜歡標新立異的科學怪人。他不使用阿拉伯數(shù)字計數(shù),而是使用小寫英文字母計數(shù),他覺得這樣做,會使世界更加豐富多彩。在他的計數(shù)法中,每個數(shù)字的位數(shù)都是相同的(使用相同個數(shù)的字母),英文字母按原先的順序,排在前面的字母小于排在它后面的字母。我們把這樣的“數(shù)字”稱為Jam數(shù)字。在Jam數(shù)字中,每個字母互不相同,而且從左到右是嚴格遞增的。每次,Jam還指定使用字母的范圍,例如,從2到10,表示只能使用{b,c,d,e,f,g,h,i,j}這些字母。如果再規(guī)定位數(shù)為5,那么,緊接在Jam數(shù)字“bdfij”之后的數(shù)字應(yīng)該是“bdghi”。(如果我們用U、V依次表示Jam數(shù)字“bdfij”與“bdghi”,則U<V< span>,且不存在Jam數(shù)字P,使U<P<V< span>)。你的任務(wù)是:對于從文件讀入的一個Jam數(shù)字,按順序輸出緊接在后面的5個Jam數(shù)字,如果后面沒有那么多Jam數(shù)字,那么有幾個就輸出幾個。
輸入輸出格式
輸入格式:
?
輸入有2行,第1行為3個正整數(shù),用一個空格隔開:
s t w (其中s為所使用的最小的字母的序號,t為所使用的最大的字母的序號。w為數(shù)字的位數(shù),這3個數(shù)滿足:1≤s<T≤26, 2≤w≤t-s )
第2行為具有w個小寫字母的字符串,為一個符合要求的Jam數(shù)字。
所給的數(shù)據(jù)都是正確的,不必驗證。
?
輸出格式:
?
輸出最多為5行,為緊接在輸入的Jam數(shù)字后面的5個Jam數(shù)字,如果后面沒有那么多Jam數(shù)字,那么有幾個就輸出幾個。每行只輸出一個Jam數(shù)字,是由w個小寫字母組成的字符串,不要有多余的空格。
?
輸入輸出樣例
輸入樣例#1:2 10 5bdfij 輸出樣例#1:
bdghi bdghj bdgij bdhij befgh
說明
NOIP 2006 普及組 第三題
【題目分析】
? ? 前面兩道題的分析我都用了魔仙堡的思維來解哈哈哈(為了避免遭到老師毒打,我決定這道題好好寫)
? ? 這道題就是在s到t個樹中找出w個數(shù),其實s沒啥用,并且要按照字典序排列
? ? 從后向前找未達到最大值t的s[len],后面的數(shù)比前面的數(shù)至少要大1
? ? 如果不符合條件(比t大或者前面這一位比他后面的大且不是最后一位),撤銷前面的操作,并退回到上一位
? ? 最終得到的len值,從第len位開始往后每一位都比前一位+1改變s串的值輸出直到i==5
?
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int a,t,w,len; char t1; string s; int main() {scanf("%d%d%d",&a,&t,&w);t1=t+96;cin>>s;for(int i=1;i<=5;i++){len=w-1;for(int j=1;j!=0;j++){s[len]++;if(s[len]>t1||(len!=w-1 && s[len]>=s[len+1]))s[len]--,len--;else break;if(len<=0) return 0;}for(int k=len+1;k<w;k++)s[k]=s[len]+k-len;cout<<s<<endl;}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/xiaoningmeng/p/5820917.html
總結(jié)
以上是生活随笔為你收集整理的洛谷P1061 Jam的计数法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot打包成Docker镜
- 下一篇: PMP读书笔记(第12章)