标签:== com style turn bsp using 多少 scan 字符
思路:
一看到这个题,他不仅要求输出字典序最小的串,还要满足两两不重复,所以我们可以先输出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; }
标签:== com style turn bsp using 多少 scan 字符
原文地址:http://www.cnblogs.com/zxqxwnngztxx/p/7257370.html