生日劲歌会B905
生日劲歌会B905 |
难度级别:C; 运行时间限制:1000ms; 运行空间限制:256000KB; 代码长度限制:2000000B |
试题描述
|
Davs到KTV唱歌庆祝生日,他妈妈给他买单的时间是n个单位时间,但KTV不会时间到就立刻鲁莽地把正在唱的歌切掉,而是等它放完,这样消费者就会多一些唱歌时间。例如,你在还有15秒时再唱一首3分钟的歌,你就会多唱165秒。现在KTV提供了Davs喜爱的n首歌,请你为Davs安排点歌的顺序,使得Davs尽可能唱更多曲目,而且离开歌厅的时间越晚越好。曲目不能重复。(中间不能空余时间) |
输入
|
第一行包含一个正整数n,接下来的若干行,每行包含一个正整数,描述一首歌曲的时间。
|
输出
|
一行,包含两个数,依次为点播歌曲的总数目和播放歌曲的总时间
|
输入示例
|
350 120 80 79 300 75 66 84 45
|
输出示例
|
6 649
|
其他说明
|
n<=10000.数字个数<=5000个
|
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int v,n,w[30000],a[30000],b[30000]; 5 int main() 6 { 7 cin>>v; 8 while(cin>>w[n]) 9 n++; //输入,我就不多说了 10 v--; //尽量留下一分钟给后面的最长的歌曲 11 sort(w,w+n); //从小到大排序 12 for(int i=0;i<n-1;i++) 13 { 14 for(int j=v;j>=w[i];j--) 15 { 16 if(b[j]<b[a[j-w[i]]]+1||(b[j]==b[a[j-w[i]]]+1&&a[j]<a[j-w[i]]+w[i])) 17 { 18 a[j]=a[j-w[i]]+w[i]; 19 b[j]=b[a[j-w[i]]]+1; 20 } 21 } 22 } 23 b[v]++; 24 a[v]+=w[n-1]; 25 cout<<b[v]<<" "<<a[v]; 26 }