NOIP 2014 普及组 T1 珠心算测验

【题意】

已知:n个数

求:求恰好等于集合中另外两个不同的数之和的数的个数

【构思】

由于数满足单调性,从小加到大,先排一下序

然后用v存储每个数等于其他数的和的次数

最后用累加器,如果v[i]>0则res++

时间复杂度:O(n^3)

【实现】

#include 
#include 
#include 
#include 

using namespace std;

const int N=101;

int n,p[N],v[N];

int main(void)
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%d",&p[i]);
	sort(p+1,p+n+1);
	for (int i=1;i<=n-2;i++)
	for (int j=i+1;j<=n-1;j++)
	for (int k=j+1;k<=n;k++) v[k]+=p[i]+p[j]==p[k];
	for (int i=1;i<=n;i++) v[0]+=(v[i]>0);
	printf("%d\n",v[0]);
	return 0;
}

【小结】

1、问不同数的个数而不是求和的方法数,注意这种问法

2、对于数列来说,若对数的位置没有要求,可以考虑通过排序将数列从不定序变成定序,这是种辅助性操作

你可能感兴趣的:(CodeVS)