D. Min Cost String

如果满足s[i]=s[j]并且s[i+1]=s[j+1],那么产生一个贡献

要求给你一个k表示只能使用前k个字母,构造出长度为n的字符串,使其总贡献最小。

 a ab ac ad ... b bc bd be ... y yz z作为一一个长度为2的块不重复的零贡献周期 重复这个周期一定是最优的

为什么?

这样的周期接周期 ,每次相同的块数量只多一个。

而每块的花费是 块数*(块数-1)/2 (想一想为什么)

如果那另 a块 次数增加  b块次数对应减少 发现贡献是变大了的

所以尽量让各个块之间出现次数相等

 

    cin>>n>>k;
    while(1){
        for(int i=0;i<k;++i){
            for(int j=i;j<k;++j){
                cout"<<(char)('a'+i);
                n--;
                if(n==0)    return ;
                if(j!=i){
                    cout<<(char)('a'+j);
                    n--;
                }
                if(n==0)    return ;
            }
        }
    }

 

posted @ 2021-04-25 23:04  PdrEam  阅读(80)  评论(0编辑  收藏  举报