题目描述
题目描述
你有块木板,这些木板都是等宽的,第个木板的长度为。你必须要制作个桶,每个桶由块木板组成,你可以用任意个木板来建造一个桶。最后要求没有剩余的木板。
每个桶的体积看作是组成该桶的最短木板长度。
你要使用所有木板来制作个桶,并且要使得所有桶的总体积最大,还要求任意两个桶的体积不超过,即对于任何和,。
输出个桶的总体积最大值。如果无法满足上述条件,则输出。
输入格式
第一行包含三个空格分隔的整数、和。
第二行包含空间分隔的整数,,,,分别表示木板的长度。
输出格式
输出一个整数,表示个桶的总体积最大值。如果无满足条件,输出。
样例
样例输入 1
复制4 2 1
2 2 1 2 3 2 2 3
样例输出 1
复制7
样例解释 1
在第一个样例中,可以形成以下桶:,,,,,,,。
样例输入 2
复制2 1 0
10 10
样例输出 2
复制20
样例解释 2
在第二个样例中,可以形成以下桶:,。
样例输入 3
复制1 2 1
5 2
样例输出 3
复制2
样例解释 3
在第三个样例中,可以形成以下桶:,。
样例输入 4
复制3 2 1
1 2 3 4 5 6
样例输出 4
复制0
样例解释 4
在第四个样例中,任意两桶的体积之差至少为,不满足为的限制。
日常发作业题解。
也是简单到爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆爆表的题
写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
cpp
#include <bits/stdc++.h>
using namespace std;
long long a[1000005];
long long n,m,x,ans;
int main(){
cin>>n>>m>>x;
for(int i=1;i<=n*m;i++)cin>>a[i];
sort(a+1,a+1+n*m);
int l=n*m;
while(l>0){
if(a[l]-a[1]>x)l--;
else break;
}
int L=n*m-l;
while(L>0&&l>0){
if(L+1<m)break;
ans+=a[l],l--,L-=m-1;
}
if(l==0&&L>0){
cout<<"0";
return 0;
}
if(L>0){
l-=m-1-L;
ans+=a[l];
l--;
}
for(int i=1;i<=l;i+=m)ans+=a[i];
cout<<ans;
}