Codeforces 848A. From Y to Y (思维,构造)

  • Source

  • Problem

    给定一个字符串,看作是n个长度为1的字符串,通过n-1次合并操作可变为一个长度为1的字符串,每次合并 s1,s2 的代价为c=azf(s1,c)f(s2,c) ,cs1,s2 都出现的字符,f(s,c)cs 中出现的次数。每个问题都存在一个最小代价。
    给出一个最小代价,输出一个字符串满足此最小代价。

  • Solution

    不同字母的合并的代价为0 ,只需要关注相同字母合并的代价。设目标字符串含有na ,可以找到这个规律:
    合并这na 的代价f(n)=n(n+1)2 。用数组把f(n) 存起来,然后用贪心构造即可。

  • Code

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int a[500],k;
    int ans[30],p=0;
    for(int i=0;i<500;++i)
        a[i]=i*(i-1)/2;
    scanf("%d",&k);
    if(!k) {printf("iloveacm\n");return 0;}
    for(int i=490;k;--i)
    {
        while(a[i]<=k)
        {
            k-=a[i];
            ans[p++]=i;
        }
    }
    for(int i=0;i<p;++i)
    {
        char c='a'+i;
        for(int j=0;j<ans[i];++j)
            printf("%c",c);
    }
    printf("\n");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章