20分,求助

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

@[yx100224](/user/920234) 你可以试试双指针
by xuzihao123 @ 2023-08-15 20:04:27


@[xuzihao123](/user/946929) 双指针是啥?(蒙逼ing)
by froth_reciprocal @ 2023-08-15 20:15:31


@[yx100224](/user/920234) 双指针差不多就是从前往后和从何往前一起搜索
by wjx38223 @ 2023-08-15 20:52:06


@[yx100224](/user/920234) 我觉得可以改成一个桶,降复杂度还好理解一点,这样子确实有点麻烦了
by wjx38223 @ 2023-08-15 20:55:13


@[wangjiaxin1234](/user/902704) 谢谢大佬,今天有点晚了,时间不多了,明天我要是不会,希望您可以在线解答,谢谢
by froth_reciprocal @ 2023-08-15 20:57:51


提供一种桶的写法吧,数组得开大一点 ```cpp for(int i = 1; i<=n; i++){ for(int j = i+1; j<=n; j++){ vis[a[i]+a[j]] = true; } } for(int i = 1; i<=n; i++){ if(vis[a[i]]){ ans++; } } ``` vis数组类似于一个桶,用来存相加的结果,再去找原本的a数组里每个值在不在这些可能其中
by wjx38223 @ 2023-08-15 20:59:29


@[wangjiaxin1234](/user/902704) 不理解 ``vis[a[i]+a[j]]=true;`` 和 ``if(vis[a[i]]) ans++;`` 求讲,谢谢dalao
by froth_reciprocal @ 2023-08-16 07:51:04


同学,你的if里面标记应该vis[t]=1; 你写的是vis[j]=1; 改了就A了
by Lv_666 @ 2023-08-16 08:36:01


@[yx100224](/user/920234) `a[i]+a[j]` 是**两个加数的和**,而在`vis`数组里记录则是标记这个结果,为了后边 _查找结果是否在原来的数组中也有出现_ 写的 `if(vis[a[i]]) ans++;`是在找数组中的这个元素有没有**作为一个和的结果出现**过,`a[i]`是这指要查询这个值 例如,a数组是{$1,2,3$}, $1+2$ 的结果是 $3$ ,那么在`vis`数组中标记 “3” 这个结果有出现,查找`vis[3]`,结果是`true`,说明在a数组中的确有两个加数和为 3, 那么这使最终答案`ans`加上1
by wjx38223 @ 2023-08-16 09:43:57


vis[a[i]+a[j]]=true; 就是说把a[i]+a[j]的和进行标记,再通过if(vis[a[i]]) ans++;判断是否存在两个数的和等于a[i],如果存在那么计数器(ans)累加
by pb0000 @ 2023-08-16 09:45:57


| 下一页