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;
}