N 只小猫站成一排,第 iii 只小猫的实力值是 aia_iai。
小猫们要组织一场比赛,对于所有 1≤i<j≤N1 \le i < j \le N1≤i<j≤N,第 iii 只小猫和第jjj只小猫之间可以展开一场精彩度为 ai+aja_i+a_jai+aj 的比赛,这样,总共就能展开 N(N−1)2\frac{N(N-1)}{2}2N(N−1) 场比赛。
熊老师想知道,这 N(N−1)2\frac{N(N-1)}{2}2N(N−1) 场比赛中精彩程度前 KKK 大的精彩程度之和是多少。
输入描述
输入共有两行。
第一行,两个正整数 N,KN, KN,K。
第二行,NNN 个正整数 a1,a2,…,aNa_1,a_2,\ldots,a_Na1,a2,…,aN。
数据满足 2≤N≤500,1≤ai≤109,1≤K≤N(N−1)22 \le N \le 500, 1 \le a_i \le 10^9, 1 \le K \le \frac{N(N-1)}{2}2≤N≤500,1≤ai≤109,1≤K≤2N(N−1)。
输出描述
输出一行包含一个整数,表示答案。
样例输入 1
3 2 1 2 3
样例输出 1
9
样例输入 2
4 6 1000000000 1000000000 1000000000 1000000000
样例输出 2
12000000000
提示
样例 111:共可以举办 333 场比赛,精彩度分别为 3,4,53,4,53,4,5,前 222 大之和为 999。
样例 222:答案可能超出int 范围,要使用 long long 才能储存的下唷!
water
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
long long A[510],ans[510*510];
int main()
{
long long n,k;
scanf("%lld%lld",&n,&k);
for(long long i=1;i<=n;i++)
{
scanf("%lld",&A[i]);
}
long long tot=0;
for(long long i=1;i<=n;i++)
{
for(long long j=i+1;j<=n;j++)
{
ans[++tot]=A[i]+A[j];
}
}
sort(ans+1,ans+tot+1);
for(long long i=tot;i>0;i--)
{
ans[i]=ans[i]+ans[i+1];
}
printf("%lld\n",ans[tot-k+1]);
}