设置一个边界,在边界的右边找答案。
先对数组由小到大排序。
从最大的三个数开始往左边遍历,当找到一个答案时设置最小数的位置为边界,因为最大值一定在边界的右边,再接着遍历......,直到循环结束
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5+10;
int n, k, a[N];
int ans = 0, r = 0; //r是边界
signed main(){
cin >> n >> k;
for(int i = 1; i<=n; i++){
cin >> a[i];
}
sort(a+1, a+n+1);
for(int i = n; i>r+2; i--){
for(int j = i-1; j>r+1; j--){
for(int p = j-1; p>r; p--){
int sum = a[i] + a[j] + a[p];
if(sum%k==0){
ans = ans>sum?ans:sum;
r = p; //找到一个答案,把第三个数设为边界,最大值就在边界的右边
}
}
}
}
cout << ans;
return 0;
}