UVA 12563 Jin Ge Jin Qu hao(多阶段决策问题,DP)
题意:给出n首爱唱的歌,剩余t时间。由于ktv最后不会强制暂停你的歌曲,所以最后你可以点一首劲歌金曲,也就是最后可以加上678秒多唱一些时间。问在保证能唱的歌曲尽量多的情况下,唱歌的时间尽量长。输出最多的唱歌数目和最长的唱歌时间。给出的n首个不会超过三分钟。
解法:很明显,劲歌金曲是一定要唱的,毕竟时间长。虽然t的范围是1e9,但是最多只有50首个,每首歌180秒,最多也才9000秒。大于9000可以直接输出全部歌都唱了。
接下来考虑一般情况,很明显,这是个01背包,我们要保证唱歌歌曲尽量多,所以每首歌的价值先当成1,然后做一遍01背包,就可以知道最多可以唱多少首歌了。加上劲歌金曲,就是dp[n][t-1] + 1.
但是在唱歌数目尽量多的前提下,我们还要保证唱歌时间尽量长。所以我们另外开一个数组保存唱歌时间,
如果唱歌数目要更新,那么唱歌时间就由前面的状态加上当前这首歌曲的时间。
如果唱歌数目相同,那么取两次比较唱歌时间最大值更新即可。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<string>
#include<set>
#include<map>
#include<stack>
#include<queue>
using namespace std;
const int maxn = 505;
const int maxm = 10005;
const int INF = 0x3f3f3f3f;
int n, t;
int dp[55][10005], val[55], cnt[55][10005];int main() {
#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);
#endifint T, Case = 1;scanf("%d", &T);while(T--) {int sum = 0;memset(dp, 0, sizeof(dp));scanf("%d%d", &n, &t);for(int i = 1; i <= n; i++) {scanf("%d", &val[i]);sum += val[i];}if(sum < t) {printf("Case %d: %d %d\n", Case++, n + 1, sum + 678);continue;}for(int i = 1; i <= n; i++) {for(int j = t - 1; j >= 0; j--) {dp[i][j] = dp[i - 1][j];cnt[i][j] = cnt[i - 1][j];if(j >= val[i]) {if(dp[i - 1][j] < dp[i - 1][j - val[i]] + 1) {dp[i][j] = dp[i - 1][j - val[i]] + 1;cnt[i][j] = cnt[i - 1][j - val[i]] + val[i]; //唱歌时间长度更新 } else if(dp[i - 1][j] == dp[i - 1][j - val[i]] + 1) {cnt[i][j] = max(cnt[i][j], cnt[i - 1][j - val[i]] + val[i]); //如果存在唱歌数目相等的情况下,肯定是让唱歌时间尽量长 }}}}printf("Case %d: %d %d\n", Case++, dp[n][t - 1] + 1, cnt[n][t - 1] + 678);}return 0;
}
UVA 12563 Jin Ge Jin Qu hao(多阶段决策问题,DP)相关推荐
- UVA 12563 Jin Ge Jin Qu hao 01背包变形
基本的01背包,更新的时候保持背包里每一个元素的num最大然后time尽量长 CSDN也支持makedown了试一下 12563 Jin Ge Jin Qu hao (If you smiled wh ...
- UVA 12563 劲歌金曲 Jin Ge Jin Qu hao
劲歌金曲 Jin Ge Jin Qu hao 题面翻译 (如果当你看到这个标题的时候笑了,那么这个问题是为你准备的ヽ( ̄▽ ̄)ノ) 如果问一个麦霸:"你在KTV里必唱的曲目有哪些?" ...
- Jin Ge Jin Qu hao UVA - 12563 (劲歌金曲)01背包,求装入的东西最多(相同多时价值大)
题目:白书p274 题意: KTV里面有n首歌曲你可以选择,每首歌曲的时长都给出了. 对于每首歌曲,你最多只能唱1遍. 现在给你一个时间限制t (t<=10^9) , 问你在最多t-1秒的时间 ...
- Jin Ge Jin Qu hao - UVa 12563 dp背包
Problem J Jin Ge Jin Qu [h]ao (If you smiled when you see the title, this problem is for you ^_^) Fo ...
- 12563 - Jin Ge Jin Qu hao
12563 - Jin Ge Jin Qu hao (If you smiled when you see the title, this problem is for you ^_^) For th ...
- UVA12563: Jin Ge Jin Qu hao(类01背包)
Problem J Jin Ge Jin Qu [h]ao (If you smiled when you see the title, this problem is for you ^_^) Fo ...
- uva 12563——Jin Ge Jin Qu hao
题意:给出n首歌及每首歌的播放时间,然后在t秒内唱这些歌,最后的剩余时间要大于0: 思路:01背包问题,对于没次选择,只有取或不取两种状态,只需在这两种状态中找到最优的策略即可. code: #inc ...
- UVA 12563 Jin Ge Jin Qu hao
dp-背包 开始用普通dp写了一发发现没法确定最大时间... 后来看到大牛机智的写法,嗯...dp表示当前状态能否成立:然后从条件最好的状态开始遍历,直到这个状态成立然后退出遍历. 具体的看代码吧.. ...
- UVa 12563 Jin Ge Jin Qu hao(01背包)
题意 你在KTV还剩t秒钟的时间 你需要在n首歌中选择尽量多的歌使得歌的数量最多的前提下剩下的时间最小 至少要留一秒给劲歌金曲 所以是一个容量为t-1的01背包 d[i][j]表示恰用j秒时 ...
最新文章
- ubuntu 12.04安装 jdk
- 【Rsyslog】 从json 中通过正则 key 获取 value值,rsyslog正则匹配获取key 的 value值
- python降级pip_1.2 pip降级selenium3.0
- ubuntu进入linux系统安装程序,Ubuntu Linux下安装软件方法
- 【机器学习算法专题(蓄力计划)】五、机器学习中的线性代数的基础操作
- python基础之运算符
- java double溢出_java – 可以加倍或BigDecimal溢出?
- 拦截第三方快递物流 ,console控制台打印正常 ,浏览器显示正常 ,传至后台乱码
- NLP-美团技术团队(搜索-推荐-召回排序-Bert)
- pandas 判断是否等于nan_Python之pandas笔记
- 程序员减压方法100%有效
- java 验证码的制作
- 《IT经理世界》:中国软件业开始起飞
- lucene2.0+heritrix
- 【微服务直播】60分钟掌握微服务治理之道
- flex sdk中mx_internal function getTextField() 这种函数如何调用?
- 如何选择和更换阿里云服务器操作系统?
- 【历史上的今天】10 月 14 日:iPhone 十年之变;英国计算机协会成立;第一个 C++ 编译器诞生
- scratch2.0 求救电话问答
- KW-Software MULTIPROG平台通过赫优讯cifX板卡实现 集成PROFIBUS-DP主站的软PLC控制器