Jin Ge Jin Qu UVa12563

来源:互联网 发布:衣阿华 知乎 编辑:程序博客网 时间:2024/05/22 06:09

题意:

       KTV里面有n首歌曲你可以选择,每首歌曲的时长都给出了. 对于每首歌曲,你最多只能唱1遍. 现在给你一个时间限制t (t<=10^9) , 问你在最多t-1秒的时间内可以唱多少首歌曲num , 且最长唱歌时间是多少time (time必须<=t-1) ? 最终输出num+1 和 time+678 即可.

       注意: 你需要优先让歌曲数目最大的情况下,再去选择总时长最长的.

分析:

       其实本题本质上就是一个标准的01背包问题. 问你<=t-1时间内最多可以选择哪些歌曲使得 (数据1,数据2)最优. 这里的数据1是歌曲数目,数据2是歌曲总时长, 且数据1优先.

       一般我们做的01背包问题都是问你<=t-1的时间内, 最多选择哪些歌曲使得歌曲数目最多 总时间最长. 但是本题需要同时考虑两个最优条件, 那么该怎么做呢?

       我们令dp[i][j]==x 表示当决策完全前i个物品后(选或不选), 所选的总歌曲时长<=j时, 所得到的最优状态为x. (这里的x就不是平时我们所说的最长时间或最多歌曲数目了)

       怎么理解最优状态为x这个事实呢? 假设有两种选择前i个歌曲的方法能使得决策完前i个物品且总时长<=j时的状态分别为x1 和x2.

       那么如果x1状态的歌曲数目> x2状态的歌曲数目, 那么明显x1状态更优. 所以dp[i][j]应==x1.

       如果x1状态的歌曲数目与x2的相等, 但是x2状态的时长 > x1状态时长, 那么此时x2状态更优. 所以dp[i][j]应==x2.

       经过上面的分析,我们可以用一个(具有歌曲数和总时长双属性的)结构体来表示一个状态. 且可以得到下面状态转移公式:

       dp[i][j] =最优(dp[i-1][j],  在dp[i-1][j-t[i]]的基础上选择第i首歌后得到的新状态tmp)

       所有dp初始化为0即可. 最终我们所求为dp[n][max_time]

 

       最后还有一个问题就是t<=10^9.我们不可能循环判断j到10^9. 其实一共50首歌曲, 每首歌曲最多180秒, 所以我们求出所有歌曲的时长和sum(sum<=50*180==9000).

       如果t-1>=sum, 那么明显所有歌曲都能被选一遍.

       如果t-1<sum,那么明显我们需要遍历到dp[i][t-1]为止.

       程序实现用的滚动数组,所以dp只有[j]这一维.

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct E{int num,tim;bool operator < (const E& x)const{if(num==x.num) return tim<x.tim;return num<x.num;}}dp[10005];int n,t,a[55];int main(){int T,i,j,sum,Case=0;scanf("%d",&T);while(T--){Case++;sum=0;memset(dp,0,sizeof(dp));scanf("%d%d",&n,&t);for(i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];}t=min(t-1,sum);for(i=1;i<=n;i++){for(j=t;j>=a[i];j--){E tmp;tmp.num=dp[j-a[i]].num+1;tmp.tim=dp[j-a[i]].tim+a[i];if(dp[j]<tmp){dp[j]=tmp;}}}printf("Case %d: %d %d\n",Case,dp[t].num+1,dp[t].tim+678);}return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 工伤认定期间被厂里辞退工资怎么办 怀孕50天看恐怖片肚子阴痛怎么办 欧卡二进游戏就卡画面了怎么办 魅族手机的微信图标找不到了怎么办 金立手机:微信图标找不到怎么办? 鞋厂装跟机老是卡钉怎么办 苹果手机摔了一下开不了机怎么办 百度网盘解析的种子保存不了怎么办 下载了种子百度网盘解析不了怎么办 正畸复诊后吃饭一直会磨嘴怎么办 遇到儿子说话对母亲不满母亲怎么办 冰箱旧了怎么办教你创新冰箱翻新法 微信陌生人加好友发红包怎么办 微信红包发了对方收不到怎么办 发红包是微信密码不知道了该怎么办 微信上红包密码不知道密码怎么办 本人不知道微信自动发红包怎么办 微信钱包里的钱没了怎么办 微信聊天删除了红包没领怎么办 微信红包未领取删掉了怎么办 微信红包没领取删掉了怎么办 微信红包没领取就删除好友了怎么办 老公一个人出去玩不愿带老婆怎么办 干了一年也攒不下钱怎么办 住院出院后请领导同事吃饭怎么办 有同事请吃饭答应了又不想去怎么办 同事请吃饭发红包不收怎么办 同事要走了请吃饭我不想去怎么办 请领导吃饭他说今晚有事我该怎么办 两个月的狗狗不吃狗粮怎么办 挖机驾驶室的小镙杆总是掉该怎么办 开挖机出了事故没有证怎么办 发现小孩有早恋现象做家长该怎么办 马上中考了初三孩子不上学怎么办 初三孩子老说自己难受不上学怎么办 幼儿园安全教案迷路了怎么办及反思 老婆发现我出轨后离家出走了怎么办 把丝袜放进马桶水箱堵了怎么办 如果老公那方面不行但人很好怎么办 老公哪里都好就是那方面不行怎么办 电饭锅盖子卡的地方掉了怎么办