这个直接当模板用吧,太巧妙了,我不是很能理解。
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdio>
using namespace std;
int arr[10005];
typedef struct node
{
int sum;
int next_id;
friend bool operator < (node a,node b)
{
return a.sum+arr[a.next_id]>b.sum+arr[b.next_id];
}
}node;
int main()
{
int T;
scanf("%d",&T);
for(int Case=1;Case<=T;Case++)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",&arr[i]);
sort(arr,arr+n);
priority_queue<node> pq;
pq.push(node{0,0});
int ans=0;
while(m--)
{
if(pq.empty()) break;
if(pq.top().next_id+1<n)
{
node first=pq.top();//马上要入队列的第一个元素
first.next_id++;
node second=pq.top();//马上要入队列的第二个元素
second.sum+=arr[second.next_id];
second.next_id++;
pq.push(first);
pq.push(second);
}
ans=pq.top().sum+arr[pq.top().next_id];
pq.pop();
}
printf("Case #%d: %d\n",Case,ans);
}
return 0;
}