题目描述
NN 只小猫站成一排,第 ii 只小猫的实力值是 a_iai。
小猫们要组织一场比赛,对于所有 1 \le i < j \le N1≤i<j≤N,第 ii 只小猫和第jj只小猫之间可以展开一场精彩度为 a_i+a_jai+aj 的比赛,这样,总共就能展开 \frac{N(N-1)}{2}2N(N−1) 场比赛。
熊老师想知道,这 \frac{N(N-1)}{2}2N(N−1) 场比赛中精彩程度前 KK 大的精彩程度之和是多少。
输入描述
输入共有两行。
第一行,两个正整数 N, KN,K。
第二行,NN 个正整数 a_1,a_2,\ldots,a_Na1,a2,…,aN。
数据满足 2 \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
提示
样例 11:共可以举办 33 场比赛,精彩度分别为 3,4,53,4,5,前 22 大之和为 99。
样例 22:答案可能超出int 范围,要使用 long long 才能储存的下唷!
本题属于签到题:先枚举出所有的比赛的结果(组合),然后排序结果即可
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
set<ll>s1;
vector<ll>v1;
ll a[505];
bool cmp(const ll a,const ll b)
{
return a>b;
}
int main()
{
ll n,k,s=0;
cin>>n>>k;
for(ll i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
for(ll i=0;i<n;i++)
{
for(ll j=i+1;j<n;j++)
{
v1.push_back(a[i]+a[j]);
}
}
sort(v1.begin(),v1.end(),cmp);
for(int i=0;i<k;i++)
{
s=s+v1[i];
}
cout<<s;
return 0;
}