zoukankan      html  css  js  c++  java
  • CodeForces 710E Generate a String

    $SPFA$,优化,$dp$。

    写了一个裸的$SPFA$,然后加了一点优化就过了,不过要$300$多$ms$。

    $dp$的话跑的就比较快了。

    $dp[i]$表示输入$i$个字符的最小花费。

    首先$dp[i]=dp[i-1]+x$。

    其次,如果$i$是个偶数,那么$dp[i]$还可以从$dp[frac{i}{2}]$推过来。

    如果$i$是奇数,那么$dp[i]$还可以从$dp[frac{i}{2}]$和$dp[frac{i}{2} + 1]$推过来。

    $SPFA$:

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<iostream>
    using namespace std;
    typedef long long LL;
    const double pi=acos(-1.0),eps=1e-8;
    void File()
    {
        freopen("D:\in.txt","r",stdin);
        freopen("D:\out.txt","w",stdout);
    }
    
    int n;
    LL x,y;
    LL a[10000010];
    bool f[10000010];
    
    int main()
    {
        scanf("%d%lld%lld",&n,&x,&y);
    
        memset(a,-1,sizeof a); a[0]=0; a[n]=n*x;
        queue<int>Q; Q.push(0); f[0]=1;
    
        while(!Q.empty())
        {
            int h=Q.front(); Q.pop(); f[h]=0;
    
            if(h+1<=n)
            {
                if(a[h+1]==-1||a[h]+x<a[h+1])
                {
                    a[h+1]=a[h]+x;
                    if(f[h+1]==0) { Q.push(h+1); f[h+1]=1; }
                }
            }
    
            if(h-1>=0)
            {
                if(a[h-1]==-1||a[h]+x<a[h-1])
                {
                    a[h-1]=a[h]+x;
                    if(f[h-1]==0) { Q.push(h-1); f[h-1]=1; }
                }
            }
    
            LL cost=min(h*x,y);
            if(2*h<=n)
            {
                if(a[2*h]==-1||a[h]+cost<a[2*h])
                {
                    a[2*h]=a[h]+cost;
                    if(f[2*h]==0) { Q.push(2*h); f[2*h]=1; }
                }
            }
    
            else
            {
                if(a[n]==-1) a[n]=a[h]+y+x*(2*h-n);
                else a[n]=min(a[n],a[h]+y+x*(2*h-n));
            }
        }
    
        printf("%lld
    ",a[n]);
        return 0;
    }

    $dp$:

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<iostream>
    using namespace std;
    typedef long long LL;
    const double pi=acos(-1.0),eps=1e-8;
    void File()
    {
        freopen("D:\in.txt","r",stdin);
        freopen("D:\out.txt","w",stdout);
    }
    
    int n; LL x,y,dp[10000010];
    
    int main()
    {
        scanf("%d%lld%lld",&n,&x,&y);
        for(int i=1;i<=n;i++)
        {
            dp[i]=dp[i-1]+x;
            if(i%2==0) dp[i]=min(dp[i],dp[i/2]+y);
            else
            {
                dp[i]=min(dp[i],dp[i/2+1]+y+x);
                dp[i]=min(dp[i],dp[i/2]+x+y);
            }
        }
        printf("%lld
    ",dp[n]);
        return 0;
    }
  • 相关阅读:
    [King.yue]Ext.net 页面布局Flex
    [King.yue]Ext.net 弹出Windows窗体注意的事项
    [Irving]SqlServer 标量函数 详解【转】
    [Andrew]Ext.net前台弹框
    [King.yue]Ext中Grid得到选择行数据的方法总结
    [zouxianghui] 清空GridPanel的checkbox选中行
    [BILL WEI]SQL 存储过程学习
    [Tommas] 测试场景 VS 测试用例 哪个更好?(转)
    winform 打印小票
    html5 input 标签
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5814706.html
Copyright © 2011-2022 走看看