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

  • Source

  • Problem

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

  • Solution

    不同字母的合并的代价为 0 0 ,只需要关注相同字母合并的代价。设目标字符串含有n a a ,可以找到这个规律:
    合并这n a a 的代价f(n)=n(n+1)2。用数组把 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值