• Level Up


     

    题意:Steve玩魔兽世界要做任务升两级,任务在你不同的等级给的经验不同,输入任务数量和升第一级和升第二级需要的经验,接着输入每个任务第一级完成给的经验和花费的时间、第二级级完成给的经验和花费的时间。求要升两级最少要花多少时间,如果不能则输出-1。

    题解:

    由题目数据可以直接想到用动态规划来做,因为最多需要的经验只有五百,因此可以开DP[I][J][K](记得开为long long,INF也得更换,我因为这个卡了很久),i代表第一级的经验,J代表第二级的经验,K代表第几个任务。具体见代码注释。

    #define _CRT_SECURE_NO_DepRECATE
    #define _CRT_SECURE_NO_WARNINGS
    #include <cstdio>
    #include <iostream>
    #include <cmath>
    #include <iomanip>
    #include <string>
    #include <algorithm>
    #include <bitset>
    #include <cstdlib>
    #include <cctype>
    #include <iterator>
    #include <vector>
    #include <cstring>
    #include <cassert>
    #include <map>
    #include <queue>
    #include <set>
    #include <stack>
    #include <stdio.h>
    #define ll long long
    #define INF 0x3f3f3f3f
    #define ld long double
    const ld pi = acos(-1.0L), eps = 1e-8;
    int qx[4] = { 0,0,1,-1 }, qy[4] = { 1,-1,0,0 }, qxx[2] = { 1,-1 }, qyy[2] = { 1,-1 };
    using namespace std;
    struct node
    {
        ll exp1, exp2, time1, time2;//一级的经验 两级的经验 一级消耗的时间 两级消耗的时间
    }ren[510];
    ll dp[511][511];
    bool cmp(node a, node b)
    {
        return a.exp1 < b.exp1;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cout.tie(0);
        ll a, b, c;
        cin >> a >> b >> c;
        ll ans = 0;
        for (ll i = 0; i <= 510; i++)
        {
            for (ll f = 0; f <= 510; f++)
            {
                dp[i][f] = numeric_limits<int64_t>::max();//初始化,注意是longlong!
            }
        }
        for (ll i = 0; i < a; i++)
        {
            cin >> ren[i].exp1 >> ren[i].time1 >> ren[i].exp2 >> ren[i].time2;
        }
        sort(ren, ren + a, cmp);//先将任务按照第一级经验的大小进行排序,否则易出bug
        dp[0][0] = 0;
        for (ll i = 0; i < a; i++)
        {
            for (ll f = b; f >= 0; f--)
            {
                for (ll k = c; k >= 0; k--)
                {
                    if (dp[f][k] == numeric_limits<int64_t>::max())
                    {
                        continue;
                    }
                    if (f < b)//如果还没到第二级
                    {
                        ll exp1 = f + ren[i].exp1, exp2 = k;
                        if (exp1 > b)//升级时溢出的经验会保留
                        {
                            exp2 = min(c, exp1 - b + k);//避免溢出的经验再溢出
                            exp1 = b;
                        }
                        dp[exp1][exp2] = min(dp[exp1][exp2], dp[f][k] + ren[i].time1);//状态转移
                    }
                    ll exp2 = min(k + ren[i].exp2, c);//避免溢出
                    dp[f][exp2] = min(dp[f][exp2], dp[f][k] + ren[i].time2);//状态转移
                }
            }
        }
        if (dp[b][c] == numeric_limits<int64_t>::max())//判断是否有解
        {
            cout << "-1";
            return 0;
        }
        cout << dp[b][c];
        return 0;
    }
  • 相关阅读:
    JSP内置对象Session
    jsp 中对jar 包的引用
    Windows下AndroidStudio 中使用Git(AndroidStudio项目于GitHub关联)
    教你怎么使用Github for Windows?
    cannot run program "git.exe":CreateProcess error=2
    如何在Android Studio上使用Github
    怎么在Android studio配置Github账号
    js下读取input中的value值
    jQuery获取多种input值的方法
    Android studio 导入github工程
  • 原文地址:https://www.cnblogs.com/Load-Star/p/12685829.html
Copyright © 2020-2023  润新知