1. 程式人生 > >日照學習提高班day4測試 x

日照學習提高班day4測試 x

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