• rual 1741. Communication Fiend 夜


    http://acm.timus.ru/problem.aspx?space=1&num=1741

    题目大意:

    主人翁需要升级客户端 现在的版本是  1  Licensed

    想以最快速度升级到版本 n

    m 个 upgrade programs

    每一个都有属性 x  y  d  s

    表示可以将版本x 升级到版本 y  d为它的大小 越小下载越快  s为类型 有 Licensed     Cracked    Pirated三种

    升级是有限制的 从x开始升级必须 当前版本就是x    

    一旦被Pirated升级后 无论再用什么类型升级 都还是 Pirated

    Licensed不可以在Pirated版本上升级

    要求所以用到的软件的d的和 最小

    存在达不到的情况

    ans0[i]表示升级到版本i 且类型为Pirated的最小时间

    ans1[i]表示升级到版本i 且类型为非Pirated的最小时间

    将m个upgrade programs 按 x 进行排序后 对ans 进行更新 最后取两种情况的最忧答案进行比较

    代码及其注释:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<string>
    #include<vector>
    #include<set>
    #include<queue>
    #include<stack>
    #include<cmath>
    #define LL long long
    
    using namespace std;
    const int N=10005;
    const LL INF=0xffffffffffff;//最大
    LL ans0[N];//升级到版本i 且类型为Pirated 最小时间
    LL ans1[N];//升级到版本i 且类型为非Pirated 的最小时间
    struct node
    {
        int x,y,d,k;
    }program[N];//升级程序
    bool cmp(node a,node b)
    {
        return a.x<b.x;
    }
    LL Fmin(LL a,LL b)
    {
        if(a<b)
        return a;
        return b;
    }
    void dp(int m)
    {
        ans1[1]=0;//初始化
        for(int i=0;i<m;++i)
        {
            int x=program[i].x;
            int y=program[i].y;
            int k=program[i].k;
            int d=program[i].d;
            if(ans0[x]<INF&&k!=2)//更新 k!=2 是因为Licensed 不能在Pirated上更新
            {
                ans0[y]=Fmin(ans0[y],ans0[x]+d);
            }
            if(ans1[x]<INF)
            {
                if(k==0)//根据版本更新
                {ans0[y]=Fmin(ans0[y],ans1[x]+d);}
                else
                {ans1[y]=Fmin(ans1[y],ans1[x]+d);}
            }
        }
    }
    int main()
    {
    //   freopen("data","r",stdin);
        int n,m;
        while(scanf("%d %d",&n,&m)!=EOF)
        {
            char stemp[10];
            for(int i=1;i<=n;++i)
            ans0[i]=ans1[i]=INF;
            for(int i=0;i<m;++i)
            {
                scanf("%d %d %d %s",&program[i].x,&program[i].y,&program[i].d,stemp);
                if(stemp[0]=='L')//将不同类型用 数字表示
                program[i].k=2;
                else if(stemp[0]=='C')
                program[i].k=1;
                else
                program[i].k=0;
            }
            sort(program,program+m,cmp);//按x排序
            dp(m);
            LL ans=Fmin(ans0[n],ans1[n]);//求最优
            if(ans==INF)
            printf("Offline\n");
            else
            {
                printf("Online\n");
                cout<<ans<<endl;
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    发现维护的自己编写linux 系统检查脚本一个bug (syslog\message)
    循环while for
    字面量(常量)和变量的区别
    网页配色方法
    Dedecms v5.7 CKEditor编辑器回车键换行改为分段
    JS控制密码框获取焦点时文字消失,失去焦点时文字出现
    JS实现选项卡
    JS实现全选、不选、反选
    JS点击显示隐藏内容
    ASP连接MSSQL代码
  • 原文地址:https://www.cnblogs.com/liulangye/p/2651348.html
Copyright © 2020-2023  润新知