@[Lruler](/user/570537)
不理解你这段代码在干嘛
```cpp
for(int i = 2; i <= n; i++){
if(a[i]<a[i-1]){
a[0] = a[i];
a[i] = a[i-1];
for(j = i-2; a[0] < a[j]; j--){
a[j+1] = a[j];
}
a[j+1] = a[0];
}
}
```
by sundyLIUXY @ 2023-01-24 17:56:11
这题要判重,题解中也说了
>1+4=5与2+3=5是一种不是两种
by sundyLIUXY @ 2023-01-24 17:57:37
@[sundyLIUXY](/user/706737) 我那一段是排个序,就是为了下面方便排重的
by Lruler @ 2023-01-25 21:58:23
@[Lruler](/user/570537) 下了一组数据,中间数据输出,您的代码并没有判重,发现您前面的那块是排序,不代表是判重
```
5
10 4 6 2 8
```
这组数据,您的程序的中间数据是这样的
```
2+8 = 10
4+6 = 10
2+6 = 8
2+4 = 6
```
很明显没有判重,仅仅排序并依次-1枚举并不能判重。其实应该开个bool数组,在后面枚举的if里,一旦满足条件,就标记。
排序不用删,但也可以删,删了就会短很多
两份代码,这是不删排序的(稍长):
```cpp
#include<bits/stdc++.h>
using namespace std;
int a[110], n, cnt;
bool vis[10010]; //bool数组判重
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin>>a[i];
int j;
for(int i = 2; i <= n; i++){
if(a[i]<a[i-1]){
a[0] = a[i];
a[i] = a[i-1];
for(j = i-2; a[0] < a[j]; j--){
a[j+1] = a[j];
}
a[j+1] = a[0];
}
}
for(int i = n; i >= 1; i--)
{
for(int j = i-1; j >= 1; j--)
{
for(int k = j-1; k >= 1; k--)
{
if(a[i]==a[j]+a[k] && !vis[a[i]])
cnt++, vis[a[i]] = 1;
//标记,标记过的就不会再重复记入答案
}
}
}
cout<<cnt;
return 0;
}
```
这是删排序的:
```cpp
#include<bits/stdc++.h>
using namespace std;
int a[110], n, cnt;
bool vis[10010];
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin>>a[i];
for(int i = n; i >= 1; i--)
{ //不排序,那么枚举顺序不限,n到1,1到n都行
for(int j = n; j >= 1; j--)
{
for(int k = n; k >= 1; k--)
{
if(a[i]==a[j]+a[k] && !vis[a[i]] && a[i] != a[j] && a[j] != a[k] && a[k] != a[i])
cnt++, vis[a[i]] = 1;
//因为删掉了排序,必须从1到n全枚举,但又得判断三个数是否一样
}
}
}
cout << cnt;
return 0;
}
```
by sundyLIUXY @ 2023-01-26 11:40:00
@[sundyLIUXY](/user/706737) 哦哦,懂了懂了,谢谢大佬
by Lruler @ 2023-01-27 10:37:50