zoukankan      html  css  js  c++  java
  • UVALive

    pro:有D个字母,每个字母有自己的权值,现状需要用它们拼出N个单词,使得这些单词互相不为另外一个的前缀。 且单词的权值和最小。D<=200; N<=200;

    sol:如果建立字典树,那个每个单词的权值权值救赎根到叶子的路径权重和。 感觉有点想哈夫曼树,但是没什么大的关系,因为不能倒推。

    由于ND比较小,我们直接贪心,维护一个大小为N+D的数组b[],一直更新,原则如下:每次排序b[],把 b[1]替换为b[1]+a[];一直操作,直到不能再变小为止。

    #include<bits/stdc++.h>
    #define ll long long
    #define rep(i,a,b) for(int i=a;i<=b;i++)
    using namespace std;
    const int maxn=410;
    const ll inf=1LL<<45;
    ll a[maxn],b[maxn];
    int main()
    {
        int N,D;ll ans;
        while(~scanf("%d%d",&N,&D)&&(N||D)){
            ans=0;
            rep(i,1,D) scanf("%lld",&a[i]);
            sort(a+1,a+D+1);
            rep(i,1,D) b[i]=a[i];
            rep(i,1,N)  b[i+D]=inf;
            rep(i,1,N) ans+=b[i];
            while(1){
                rep(i,1,D) b[i+N]=b[1]+a[i];
                b[1]=b[N+D];
                sort(b+1,b+N+D);
                ll sum=0;
                rep(i,1,N) sum+=b[i];
                if(sum<ans) ans=sum;
                else break;
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }

    当然,也可以DP来做,dp[i][j]表示根有i个儿子,j个叶子时的最小代价。

  • 相关阅读:
    mysql 权限问题
    触发器作用
    带有循环功能的存储过程
    带有条件判断的存储过程
    数据存储 三大范式-----------待续
    存储过程自 带条件判断的存储过程
    线程异步更新UI
    TextBox只能输入数字
    C#中无边框窗体移动或拖控件移动窗体
    classloader原理
  • 原文地址:https://www.cnblogs.com/hua-dong/p/10987800.html
Copyright © 2011-2022 走看看