题目链接: 传送门
题目贴上:
这道题目也算是水题吧O-O,@-@, ==
题意:给你n个桶,第i个桶里面承装的水是ai,你可以将一个桶(a桶)内的水倒入另一个桶里面(b桶),但是前提是a桶不为空。这样子就算一次操作,至于从a桶倒入b桶多少水都是可以(全部也可以),现在你的任务是,你最多可以执行这样子的操作k次,然而使最多水的桶和最少水的桶之差尽可能大,现在问你你该如何操作,获得这个差最大,并输出。
思路: 首先你要使最大和最小的差最大,那肯定每次倒水的时候全倒了,这样子被倒入水的桶可以获得最多,而另一个桶水量直接为0,这样子差距不就是最大的吗,所以水量最少的桶一定是空桶。 那只要让最大水量的桶的水量最大,那差就最大了(必须的)。
所以,排序,从大到小,从小到大无所谓,,然后每次加最大的桶,k–,直到k减完或者i不符合条件退出为止
#include<bits/stdc++.h>
namespace mySpace{
typedef long long int ll;
typedef long double ld;
typedef double db;
//typedef __int64 int bi;
//nth_element(first,pos,end) =>STL function ,求第pos小的元素
#define fori(a,b,c) for(int a=b;a<=c;++a)
#define me(a) memset(a,0,sizeof a)
#define Mod 1000000009
#define exp 1e-8
#define fi first
#define se second
#define sc_int(x) scanf("%d",&x)
#define sc_db(x) scanf("%lf",&x)
#define sc_str(x) scanf("%s",x)
#define sc_bi(x) scanf("%I64d",&x)
#define pr_int(x) printf("%d\n",x)
#define pr_bi(x) printf("%lld\n",x)
const int INF = 0x7fffffff;
const int MAX1 = 2e5+10;
const int MAX2 = 1e6+10;
const int MAX3 = 2e6+10;
//#define IS std::ios::sync_with_stdio(false)
//#define OS std::cin.tie(NULL)
void readFoler()
{
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
}
void closeFoler()
{
fclose(stdin);
fclose(stdout);
}
}
using namespace std;
using namespace mySpace;
ll a[MAX1];
int main(void)
{
int t,n,k;
sc_int(t);
while(t--)
{
scanf("%d %d",&n,&k);
for(int i=1;i<=n;++i){
scanf("%I64d",&a[i]);
sort(a+1,a+1+n);
ll sum = a[n];
for(int i=n-1;i>=1;--i){
if(k<=0 || a[i]==0) break;
--k;
sum+=a[i];
}
printf("%I64d\n",sum);
}
}