求助!!30pts!!!WA了7个点!!!!!

P2141 [NOIP2014 普及组] 珠心算测验

@[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


|