华师一附中OI组
标题:
P2736 “破锣摇滚”乐队 Raucous Rockers
[打印本页]
作者:
admin
时间:
2018-6-29 18:30
标题:
P2736 “破锣摇滚”乐队 Raucous Rockers
https://www.luogu.org/problemnew/show/P2736
题目描述
你刚刚继承了流行的“破锣摇滚”乐队录制的尚未发表的N(1 <= N <= 20)首歌的版权。你打算从中精选一些歌曲,发行M(1 <= M <= 20)张CD。每一张CD最多可以容纳T(1 <= T <= 20)分钟的音乐,一首歌不能分装在两张CD中。CD数量可以用完,也可以不用完
不巧你是一位古典音乐迷,不懂如何判定这些歌的艺术价值。于是你决定根据以下标准进行选择:
1.歌曲必须按照创作的时间顺序在所有的CD盘上出现。(注:第i张盘的最后一首的创作时间要早于第i+1张盘的第一首)
2.选中的歌曲数目尽可能地多
输入输出格式
输入格式:
第一行: 三个整数:N, T, M.
第二行: N个整数,分别表示每首歌的长度,按创作时间顺序排列。
输出格式:
一个整数,表示可以装进M张CD盘的乐曲的最大数目。
输入输出样例
输入样例#1:
4 5 2
4 3 4 2
输出样例#1:
3
说明
题目翻译来自NOCOW。
USACO Training Section 3.4
作者:
walk_alone
时间:
2018-7-29 09:16
#include <cstdio>
int max(int a,int b,int c)
{
int t=-999;
if(t<a)
t=a;
if(t<b)
t=b;
if(t<c)
t=c;
return t;
}
int time[21],f[21][21];
int main()
{
int n,m,t;
scanf("%d%d%d",&n,&t,&m);
for(int i=1;i<=n;i++)
scanf("%d",&time[i]);
for(int i=1;i<=n;i++)
for(int j=m;j>=1;j--)
for(int k=t;k>=time[i];k--)
f[j][k]=max(f[j][k],f[j-1][t]+1,f[j][k-time[i]]+1);
printf("%d",f[m][t]);
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-7-29 10:35
#include<bits/stdc++.h>
using namespace std;
int n,m,t;
int a[21],f[21][21];
int main()
{
cin>>n>>t>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=m;j>=1;j--)
for(int k=t;k>=a[i];k--)
f[j][k]=max(f[j][k],max(f[j-1][t]+1,f[j][k-a[i]]+1));
cout<<f[m][t];
return 0;
}
复制代码
作者:
张笑宇
时间:
2018-7-29 11:40
#include<iostream>
using namespace std;
int n,m,t,ans=-1,s=1;
int cd[25],tim[25];
void dfs(int x,int sum)
{
if(sum+n+1-x<=ans) return;
if(x==n+1)
{
ans=max(ans,sum);
return;
}
if(cd[s]>=tim[x])
{
cd[s]-=tim[x];
dfs(x+1,sum+1);
cd[s]+=tim[x];
}
if(s<m&&t>=tim[x])
{
s++;
cd[s]-=tim[x];
dfs(x+1,sum+1);
cd[s]+=tim[x];
s--;
}
dfs(x+1,sum);
}
int main()
{
cin>>n>>t>>m;
for(int i=1;i<=n;i++) cin>>tim[i];
for(int i=1;i<=m;i++) cd[i]=t;
dfs(1,0);
cout<<ans;
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2