1511D. Min Cost String

D. Min Cost String


需求数组放在char res[]里。

  • 理解过后不难看出要求构造一个字符串,字符串要求Si+S(i+1) != Sj+S(j+1)。

  • 最初理解是将a放在res[0]里,后面依次放入一对与前面不同的字符,如k==4的时候字符串为aabacadbcbdcd。--wa了直接--

  • 画图分析以后发现每到达下一个字母时应该把当前字母也放进去k=4的时候就变成了aabacadbbcbdccddd。--ac了直接--

上Google看别的代码的时候发现这个好像叫欧拉回路大小为k * k--(完全看不懂--。


ac🐎

#include<iostream>
#include<algorithm>

using namespace std;

const int N = 1000010;

int n;
int k;
char res[N];
int idx1 = 0,idx2 = 1;
int m;

int main(){
    cin >> n >> k;
    
    if(k >= n){
        for(int i = 0;i < n;i ++) printf("%c",'a' + i);
        return 0;
    }
    
    m = k * (k - 1) >> 1;
    
    res[0] = 'a';
    
    for(int i = 1;i <= min(m * 2 + k,n);i += 2){
        res[i] = 'a' + idx1;
        res[i + 1] = 'a' + idx2 ++;
        if(idx2 == k){
            idx1 ++;
            i += 2;
            res[i] = 'a' + idx1;
            i --;
            idx2 = idx1 + 1;
        }
    }
    
    for(int i = 0,cnt = 0;i < n;i ++){
        printf("%c",res[cnt ++]);
        if(cnt >= m * 2 + k) cnt = 0;
    }
    
    return 0;
}
posted @ 2021-04-25 19:29  Xuuxxi  阅读(71)  评论(0编辑  收藏  举报