先给出数字的数量n,然后是n个数字。
问能不能找出最大的 d=a + b+c 其中abcd都属于n个数字中,且不重复。
显示用map标记是都出现。
如果三层循环直接暴力,会超时。
所以要分成a+b = d-c变成两层循环。
a+b是把所有出现的和都标记,在看看d-c能不能得到出现的和。
注意的是要abcd都不同,那么标记和时,也要把ab记录下来,我用的是结构体。
AC代码:
#include<iostream>
#include<map>
#include<string.h>
#include<cmath>
using namespace std;
#define ll long long
int t;
struct node {
int i;
int j;
};
map<ll,int> m;
map<ll ,node> m2;
map<ll ,int> m3;
ll num[1005];
int main () {
while (cin >> t && t) {
m.clear();
m2.clear();
m3.clear();
int res = -1;
for (int i = 0;i < t;i++) {
cin >> num[i];
m[num[i]] = 1;
}
for (int i = 0 ; i < t ;i++) {
for (int j = i + 1;j < t ;j++) {
m2[num[i] + num[j]].i = i;
m2[num[i] + num[j]].j = j;
m3[num[i] + num[j]] = 1;
}
}
for (int i = 0; i < t ;i++) {
for (int j = i + 1 ; j < t ;j++) {
ll temp = abs(num[i] - num[j]);
if (m3[temp] == 1 && m2[temp].i != i && m2[temp].i != j && m2[temp].j != i && m2[temp].j != j ) {
ll temp2 = num[i] > num[j]? num[i] :num[j];
if (temp2 > res)
res = temp2;
}
}
}
if (res == -1)
cout << "no solution\n";
else
cout << res <<endl;
}
}