UVA 12563 Jin Ge Jin Qu hao

来源:互联网 发布:期货投资分析软件 编辑:程序博客网 时间:2024/05/24 00:47

Jin Ge Jin Qu hao

 UVA - 12563 
题意: 给你  n  个歌曲 和 你的唱歌的时间。 接下来是每一首歌 的时间长度 , 但是在
ktv 唱歌有个bug 就是在你定的时间接受之前你再点一首歌,  假设你定了 100  秒
在95秒是你选择唱了一首 劲歌金曲 那么 就相当于你多唱了  678-5 秒   你的任务是在唱的歌曲数目尽量多的情况下  要求唱 的时间尽量的长。

思路:要求  在唱歌数目尽量多的情况下 要求时间尽量的长,, 那么我们考虑 在  ,
m-1  秒内  我们能唱的最大的歌曲数目  , 当然是0 1 背包的思路, 考虑 能唱的最大的时间长度。 那么就是在  num相等的情况下,要 保证 时间time 尽量的的d大  ,那么
我们可以定义一个结构体背包,  然后定义 结构体的优先级 ,就可以了 。  

代码:
#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>using namespace std;const int N =180*55;struct node{int num;int time;bool operator < (const node &a ) const {if(a.num==num) return a.time>time;else return a.num>num;}}dp[N];int n,m;int t[55];int main(){int cas;cin>>cas;for(int kk=1;kk<=cas;kk++){cin>>n>>m;memset(dp,0,sizeof(dp));int sum=0;for(int i=1;i<=n;i++){cin>>t[i];sum+=t[i];}int maxt=min(sum,m-1);for(int i=1;i<=n;i++){for(int j=maxt;j>=t[i];j--){node tmp;tmp.num=dp[j-t[i]].num+1;tmp.time=dp[j-t[i]].time+t[i];if(dp[j]<tmp){dp[j]=tmp;}}}printf("Case %d: ",kk);printf("%d %d\n",dp[maxt].num+1,dp[maxt].time+678);}return 0;}


原创粉丝点击