Source
Problem
给定一个字符串,看作是n个长度为1的字符串,通过n-1次合并操作可变为一个长度为1的字符串,每次合并 s1,s2 s 1 , s 2 的代价为 ∑′z′c=′a′f(s1,c)∗f(s2,c) ∑ c = ′ a ′ ′ z ′ f ( s 1 , c ) ∗ f ( s 2 , c ) , c c 为都出现的字符, f(s,c) f ( s , c ) 是 c c 在中出现的次数。每个问题都存在一个最小代价。
给出一个最小代价,输出一个字符串满足此最小代价。Solution
不同字母的合并的代价为 0 0 ,只需要关注相同字母合并的代价。设目标字符串含有个 a a ,可以找到这个规律:
合并这个 a a 的代价。用数组把 f(n) 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;
}