题目描述
从前有只猪叫笨笨,它非常喜欢喝蜂蜜柚子茶,但是为了防止变胖,因此每天喝的量不能超过k克拉(蜂蜜柚子茶非常珍贵,因此需要以克拉来度量)。因为他实在是太喜欢和蜂蜜柚子茶了,因此每天他都希望能够尽可能早地喝完,所以每次睡前会将柚子茶放在床头,这样就可以在每天零点的时候开始喝啦。
然后,和其他猪一样,笨笨的鼻子上有两个孔,因此每天最多只能够喝2瓶柚子茶。今天笨笨买了n瓶柚子茶,作为接下来m天的存量。请问笨笨在这m天里面,最多可以喝多少克拉的柚子茶?
输入
第一行一个整数T,表示测试数据组数。
对每组测试数据,输入包括两行,第一行包括三个整数,以空格分格,分别是n,m,k。
第二行包括n个整数,以空格分格,表示每瓶柚子茶的重量。
T<=20
1<=N<=500
0<=M<=100
1<=K<=10000
输出
对每组测试数据,输出一个整数,为笨笨在m天里最多可以喝的柚子茶的重量。
样例输入
2 4 2 100 50 50 100 150 4 2 100 1 2 3 4
样例输出
200 10
贪心:每天都尽可能喝最多的茶
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define MAX 501
int a[MAX];
int b[MAX];
int vis[MAX];
bool cmp(int a,int b){
return a>b;
}
int main()
{
int t,m,n,k,h,sum,l,r,p; cin>>t;
while(t--){
cin>>n>>m>>k;
for(int i=0;i<n;i++) vis[i]=0;
h=0; sum=0;
for (int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
l=0,r=n-1;
while(r>=0&&a[r]>k) r--;
while(r>0&&a[r]+a[0]>k){
b[h++]=a[r--];
}
while(l<r){
while(l<r&&a[l]+a[r]<=k)l++;
if (l>=r) break;
for (p=l-1;p>=0&&vis[p];p--);
if (p<0) b[h++]=a[r--];
else{
b[h++]=a[p]+a[r--];
vis[p]=1;
}
}
bool u=0;
for (int i=r;i>=0;i--){
if (!vis[i]) {
if(!u)b[h]=a[i];
else b[h++]+=a[i];
u=!u;
}
}
if (u)h++;
sort(b,b+h,cmp);
int mi=(h>m)?m:h;
for (int i=0;i<mi;i++)
sum+=b[i];
cout<<sum<<endl;
}
return 0;
}