日照學習提高班day4測試 x
阿新 • • 發佈:2017-07-29
src 什麽 images als 情況 字母 多少 個數 完全
暫時先搞一個題吧qwq
思路:
一看到這個題,他不僅要求輸出字典序最小的串,還要滿足兩兩不重復,所以我們可以先輸出ababab...什麽的,最後綴上要求的k-2種字母
坑點:
當然這樣想是不完全的!該題是擁有許多特殊情況的!
例:
①當n==k的時候(直接從字符‘a’往後面一個一個接著輸出就好啦~)
②除去①之後若k==1(即只允許一中字符出現,但是又需要輸出多個字符的情況)(直接輸出-1)
③當k>n的時候(直接輸出-1)
④當k==2的時候(能輸出多少對ab就輸出幾對ab,若不成對的話,倒數第二個輸出a,即abababababababa什麽的 )
⑤當k==3的時候(最後輸出‘c’,前面能輸出幾對ab就輸出幾對ab,若不成對的話,倒數第二個輸出a,即abababababababa什麽的)
⑥其余為普通情況(見思路)
上代碼:
#include <iostream> #include <cstdio> using namespace std; const int Maxn = 10010; int n,k,cnt; int p,p2; //p是ab在不特殊情況下的總個數 //p2是在不特殊情況下除ab以外的總個數 int main() { freopen("str.in","r",stdin); freopen("str.out","w",stdout); scanf("%d%d",&n,&k); if(n==k) { for(int i=0;i<n;++i) printf("%c",(char)i+‘a‘); return 0; } if(k==1 || k>n) { printf("-1"); return 0; } p=n-k+2,p2=k-2;bool flag=false; if(k<=2) { while(cnt<n) { if(flag) printf("b"),flag=false; else printf("a"),flag=true; ++cnt; } return 0; } if(k==3) { while(cnt<n-1) { if(flag) printf("b"),flag=false; else printf("a"),flag=true; ++cnt; } printf("c"); return 0; } while(cnt<p) { if(flag) printf("b"),flag=false; else printf("a"),flag=true; ++cnt; } for(int i=3;i<3+p2;++i) printf("%c",(char)i+96); return 0; }
日照學習提高班day4測試 x