码迷,mamicode.com
首页 > 其他好文 > 详细

日照学习提高班day4测试 x

时间:2017-07-29 20:49:42      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:==   com   style   turn   bsp   using   多少   scan   字符   

暂时先搞一个题吧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

标签:==   com   style   turn   bsp   using   多少   scan   字符   

原文地址:http://www.cnblogs.com/zxqxwnngztxx/p/7257370.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!