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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章