zoukankan      html  css  js  c++  java
  • B. Level Up dp

    链接

    题意:

    一个人要升两级,有n个任务x,t,y,r ,升第一级要s1经验,升第二级要s2经验

    如果没升过级,选择该任务会耗费ti时间且会获得xi经验,如果升过一级,那么会获得y经验且耗费r时间,问最少多少时间能升两级。(如果跨过了第一级溢出经验同样加上)

    题解:

    • 很简单的一个01背包 但是比赛的时候一直wa5
    • 对所有任务按照x排序就可以a了
    • 比如有三个任务 x值分别为90 40 40  s1=100 只能溢出30 
    • 排序后40 40 90 可以70  
    • 这两种是完全不一样的  不不排序永远错失了这种情况
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=600+10;
    ll dp[510][510];
    const ll inf=1e18;
    struct node {
        int x,y,t,r;
        bool operator < (const node &b) const {
            return x<b.x;
        }
    
    }s[N];
    int main() {
        int n;
        int x,y,r,t,s1,s2;
        cin>>n>>s1>>s2;
        for(int i=0;i<=s1;i++) {
            for(int j=0;j<=s2;j++) dp[i][j]=inf;
        }
        dp[0][0]=0;
        for(int i=1;i<=n;i++) scanf("%d%d%d%d",&s[i].x,&s[i].t,&s[i].y,&s[i].r);
        sort(s+1,s+1+n);
        for(int i=1;i<=n;i++) {
            x=s[i].x,t=s[i].t,y=s[i].y,r=s[i].r;
            for(int j=s1;j>=0;j--)
                for(int k=s2;k>=0;k--) if(dp[j][k]!=inf) {
                    if(j<s1) {
                        if(j+x<=s1)
                            dp[j+x][k]=min(dp[j+x][k],dp[j][k]+t);
                        else
                            dp[s1][min(k+(j+x)-s1,s2)]=min(dp[s1][min(s2,k+(j+x)-s1)],dp[j][k]+t);
                    }
                    if(k<s2) {
                        dp[j][min(k+y,s2)]=min(dp[j][min(k+y,s2)],dp[j][k]+r);
                    }
            }
        }
        if(dp[s1][s2]==1e18) printf("-1");
        else printf("%lld",dp[s1][s2]);
        return 0;
    }
    View Code
  • 相关阅读:
    设计手稿: 搜索引擎
    软件版本介绍
    VS2012中使用编译的Qt-5.1.1静态库开发程序
    POJ2236(并查集)
    Java关键字this的用法总结
    paip.提升用户体验-----c++ gcc 命令在notepad++扩展中的配置..
    MySQL基本查询语句练习
    [置顶] 提升代码内外部质量的22条经验
    mysql 数据库复制表 create table city1 like city;
    两个脚本
  • 原文地址:https://www.cnblogs.com/bxd123/p/11880318.html
Copyright © 2011-2022 走看看