[COCI2011-2012#6] JACK
题目描述
给定 n n n 个正整数 a 1 … a n a_1 \dots a_n a1…an,请从中选择 3 3 3 个数字,满足他们的和不大于给定的整数 m m m,请求出这个和最大可能是多少。
输入格式
第一行有两个整数,分别表示数字个数 n n n 和给定的整数 m m m。
第二行有 n n n 个整数,表示给定的 n n n 个数字 a i a_i ai。
输出格式
输出一行一个整数表示答案。
样例 #1
样例输入 #1
5 21
5 6 7 8 9
样例输出 #1
21
样例 #2
样例输入 #2
10 500
93 181 245 214 315 36 185 138 216 295
样例输出 #2
497
提示说明
数据规模与约定
- 对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 100 1 \leq n \leq 100 1≤n≤100, 6 ≤ m ≤ 3 × 1 0 5 6 \leq m \leq 3 \times 10^5 6≤m≤3×105, 1 ≤ a i ≤ 1 0 5 1 \leq a_i \leq 10^5 1≤ai≤105,数据保证有解。
说明
题目译自 COCI2011-2012 CONTEST #6 T1 JACK,翻译来自 @一扶苏一。
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e3+10;
ll a[N];
int main()
{
ll n,m;
cin>>n>>m;
for(ll i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
ll ans=0;
for(ll i=1;i<=n;i++)
for(ll j=i+1;j<=n;j++)
for(ll k=j+1;k<=n;k++)
{
if(a[i]+a[j]+a[k]<=m)
ans=max(ans,a[i]+a[j]+a[k]);
}
cout<<ans<<endl;
return 0;
}