题意:给出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)相关推荐

  1. UVA 12563 Jin Ge Jin Qu hao 01背包变形

    基本的01背包,更新的时候保持背包里每一个元素的num最大然后time尽量长 CSDN也支持makedown了试一下 12563 Jin Ge Jin Qu hao (If you smiled wh ...

  2. UVA 12563 劲歌金曲 Jin Ge Jin Qu hao

    劲歌金曲 Jin Ge Jin Qu hao 题面翻译 (如果当你看到这个标题的时候笑了,那么这个问题是为你准备的ヽ( ̄▽ ̄)ノ) 如果问一个麦霸:"你在KTV里必唱的曲目有哪些?" ...

  3. Jin Ge Jin Qu hao UVA - 12563 (劲歌金曲)01背包,求装入的东西最多(相同多时价值大)

    题目:白书p274 题意:  KTV里面有n首歌曲你可以选择,每首歌曲的时长都给出了. 对于每首歌曲,你最多只能唱1遍. 现在给你一个时间限制t (t<=10^9) , 问你在最多t-1秒的时间 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. uva 12563——Jin Ge Jin Qu hao

    题意:给出n首歌及每首歌的播放时间,然后在t秒内唱这些歌,最后的剩余时间要大于0: 思路:01背包问题,对于没次选择,只有取或不取两种状态,只需在这两种状态中找到最优的策略即可. code: #inc ...

  8. UVA 12563 Jin Ge Jin Qu hao

    dp-背包 开始用普通dp写了一发发现没法确定最大时间... 后来看到大牛机智的写法,嗯...dp表示当前状态能否成立:然后从条件最好的状态开始遍历,直到这个状态成立然后退出遍历. 具体的看代码吧.. ...

  9. UVa 12563 Jin Ge Jin Qu hao(01背包)

    题意  你在KTV还剩t秒钟的时间  你需要在n首歌中选择尽量多的歌使得歌的数量最多的前提下剩下的时间最小 至少要留一秒给劲歌金曲  所以是一个容量为t-1的01背包   d[i][j]表示恰用j秒时 ...

最新文章

  1. ubuntu 12.04安装 jdk
  2. 【Rsyslog】 从json 中通过正则 key 获取 value值,rsyslog正则匹配获取key 的 value值
  3. python降级pip_1.2 pip降级selenium3.0
  4. ubuntu进入linux系统安装程序,Ubuntu Linux下安装软件方法
  5. 【机器学习算法专题(蓄力计划)】五、机器学习中的线性代数的基础操作
  6. python基础之运算符
  7. java double溢出_java – 可以加倍或BigDecimal溢出?
  8. 拦截第三方快递物流 ,console控制台打印正常 ,浏览器显示正常 ,传至后台乱码
  9. NLP-美团技术团队(搜索-推荐-召回排序-Bert)
  10. pandas 判断是否等于nan_Python之pandas笔记
  11. 程序员减压方法100%有效
  12. java 验证码的制作
  13. 《IT经理世界》:中国软件业开始起飞
  14. lucene2.0+heritrix
  15. 【微服务直播】60分钟掌握微服务治理之道
  16. flex sdk中mx_internal function getTextField() 这种函数如何调用?
  17. 如何选择和更换阿里云服务器操作系统?
  18. 【历史上的今天】10 月 14 日:iPhone 十年之变;英国计算机协会成立;第一个 C++ 编译器诞生
  19. scratch2.0 求救电话问答
  20. KW-Software MULTIPROG平台通过赫优讯cifX板卡实现 集成PROFIBUS-DP主站的软PLC控制器

热门文章

  1. Matlab 函数的参数列表中有多个省略号(…)是什么意思?
  2. 报关软件Trade Link 安装
  3. 【微信小游戏】微信对战小游戏知识储备
  4. 场内场外基金和开户避坑
  5. 部署C#服务到win7/Windows server 2008 R2服务器上
  6. 机器人将颠覆零售业,看AI在零售行业有哪些应用?
  7. Windows10输入法繁体简体切换
  8. 数字电子技术基础——第一章 绪论(笔记)
  9. linux pt 下载软件,下载工具系列——Deluge (全平台BT/PT下载工具)
  10. Word2Vec详解-公式推导以及代码