Source
Problem
给定一个字符串,看作是n个长度为1的字符串,通过n-1次合并操作可变为一个长度为1的字符串,每次合并 的代价为 , 为 都出现的字符, 是 在 中出现的次数。每个问题都存在一个最小代价。
给出一个最小代价,输出一个字符串满足此最小代价。Solution
不同字母的合并的代价为 ,只需要关注相同字母合并的代价。设目标字符串含有 个 ,可以找到这个规律:
合并这 个 的代价 。用数组把 存起来,然后用贪心构造即可。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;
}