Professor Vasechkin is studying evolution of worms. Recently he put forward hypotheses that all worms evolve by division. There are n forms of worms. Worms of these forms have lengths a1, a2, ..., an. To prove his theory, professor needs to find 3 different forms that the length of the first form is equal to sum of lengths of the other two forms. Help him to do this.
The first line contains integer n (3 ≤ n ≤ 100) — amount of worm's forms. The second line contains nspace-separated integers ai (1 ≤ ai ≤ 1000) — lengths of worms of each form.
Output 3 distinct integers i j k (1 ≤ i, j, k ≤ n) — such indexes of worm's forms that ai = aj + ak. If there is no such triple, output -1. If there are several solutions, output any of them. It possible that aj = ak.
5 1 2 3 5 7
3 2 1
5 1 8 1 5 1
-1
想了很久,后来才发觉直接暴力解决就可以轻松过,完全不用任何优化。直接cin然后三重for loop暴力遍历所有组合。我优化了一下,然后发觉跟直接暴力用时完全一样T.T
AC Code:
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
struct Num
{
int idx;//index
int val;//value
}a[1001];
int cmp(const void *xx,const void *yy)
{
struct Num *x=(Num*)xx;
struct Num *y=(Num*)yy;
return x->val-y->val;
}
int main()
{
int n;
int i,j,k;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i].val);
a[i].idx=i;
}
qsort(&a[1],n,sizeof(a[1]),cmp);
for(i=1;i<n;i++)
for(j=i+1;j<n;j++)
for(k=j+1;k<=n;k++)
{
if(a[k].val==a[i].val+a[j].val)
{
printf("%d %d %d\n",a[k].idx,a[i].idx,a[j].idx);
goto loop;//这样退出较快
}
else if(a[k].val>a[i].val+a[j].val)
break;
}
puts("-1");
loop:
return 0;
}