Level Up - ICPC Southeastern Europe Contest 2019(简单DP)
Posted load-star
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Level Up - ICPC Southeastern Europe Contest 2019(简单DP)相关的知识,希望对你有一定的参考价值。
题意: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; }
以上是关于Level Up - ICPC Southeastern Europe Contest 2019(简单DP)的主要内容,如果未能解决你的问题,请参考以下文章
HAL库 output level 和 pull up/ pull down 的区别
程序员情商up程序员们不要太陶醉公司给自己的职位/level
Android Navigation Drawer Show Up Indicator for Lower Level Fragments