@[2022LiJinLin](/user/755503) 注意,加数和被加数必须是集合中的两个不同的数。
by Ruiqun2009 @ 2022-12-31 12:04:30
另外,还要 `vis` 数组记录是否用过。
by Ruiqun2009 @ 2022-12-31 12:06:47
所以代码应该是[这样](https://www.luogu.com.cn/record/98324191)的。
by Ruiqun2009 @ 2022-12-31 12:07:51
@[Ruiqun2009](/user/589895)
这个行不行?刚刚提交了,只有10分,但我感觉算法或许应该是对的,咋回事?
```c++
#include<stdio.h>
int a[105];
int main(){
int n,s=0;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<n;k++){
if(a[i]+a[j]==a[k]&&i!=j&&j!=k) {s++;printf("%d %d %d\n",i,j,k);}
}
}
}
printf("%d",s/2);
return 0;
}
/*加数和被加数和和分别对应i,j,k,由于都是正整数,两数和是个定值,所以每个不同的式子的加数和被加数会被重复算两倍,结果再除以2*/
```
by LiJinLin_AFO @ 2022-12-31 12:19:06
我放下代码吧
```cpp
#include<stdio.h>
int a[105];
bool vis[1000005];
int main(){
int n,s=0;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&a[i]);
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
for(int k=0;k<n;k++){
if(k!=i&&k!=j&&a[i]+a[j]==a[k]&&!vis[k]){
s++;
vis[k]=1;
}
}
}
}
printf("%d",s);
return 0;
}
```
by Ruiqun2009 @ 2022-12-31 12:20:42
谢谢大佬!!!
by LiJinLin_AFO @ 2022-12-31 12:21:48
可以只遍历小于该数一半的数,避免两数相同,减少时间.
代码:```cpp
#include<bits/stdc++.h>
using namespace std;
#define MAXN 110
int a[MAXN];
bool find(int x,int n){
while(n--){
if(a[n]==x) return 1;
}
return 0;
}
bool add(int x,int n){
int half_x=(x-1)/2;
for(int i=0;i<n;i++){
int m=a[i];
if(m<=half_x){
if(find(x-m,n)) return 1;
}
}
return 0;
}
int main(){
int n,ans=0;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++){
ans+=add(a[i],n);
}
cout<<ans;
return 0;
}
```
by jzhjzh123 @ 2023-01-04 15:53:19
```cpp
#include<bits/stdc++.h>
using namespace std;
#define MAXN 110
int a[MAXN];
bool find(int x,int n){
while(n--){
if(a[n]==x) return 1;
}
return 0;
}
bool add(int x,int n){
int half_x=(x-1)/2;
for(int i=0;i<n;i++){
int m=a[i];
if(m<=half_x){
if(find(x-m,n)) return 1;
}
}
return 0;
}
int main(){
int n,ans=0;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++){
ans+=add(a[i],n);
}
cout<<ans;
return 0;
}
```
by jzhjzh123 @ 2023-01-04 15:54:10
```#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int num[101] = {0};
for(int i = 1;i<=n;i++){
scanf("%d",&num[i]);
}
int ret = 0;
for(int i = 1;i<=n;i++){
int flag = 0;
for(int j = 1;j<=n;j++){
for(int k = j+1;k<=n;k++){
if(num[i]==num[j]+num[k]){
ret++;
flag = 1;
break;
}
}
if(flag){
break;
}
}
}
printf("%d",ret);
return 0;
}
```
这道题数据范围不大,直接暴力就可以过,关键是注意输出的是符合条件的元素个数而不是有多少种可能,所以检测成功后要跳两个循环,可以用goto,也可以像我这样(能不用goto就不用).
by psyduck0523 @ 2023-01-04 16:24:08