NOIP201401珠心算测验题解

这道题看起来很简单,但还是有坑的!

这是我最开始的代码:

#include<bits/stdc++.h>
using namespace std;
int n;
int a[101];
int flag[101]={true};
int i,j;
int k;
int ans=0;
inline void Read()
{
    cin>>n;
    for(i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
}
inline void solve()
{
    for(i=0;i<n;i++)
    {
        for(j=i;j>=0;j--)
        {
            for(k=j;k>=0;k--)
            {
                if(k==j) continue;
                else if(a[j]+a[k]==a[i])
                {
                    ans++;
                }
            }
        }
    }
    cout<<ans<<endl; 
}
int main()
{
    Read();
    solve();
}

但是只得了30分,WA的一声哭了出来。

那么原因是什么呢?

好好读题!

其中有多少数,恰好等于集合中另外两个(不同的)数之和?

而上面的代码求的是方法的个数,比如6=1+5、2+4,算了两次。

正确的代码是这样的:

#include<iostream>
#include<algorithm>
using namespace std;
int main( )
{
	int n,ans=0;
	int i,j,k,flag=0;
	int a[1010];
	cin>>n;
	for(i=0;i<n;i++)
	{
		cin>>a[i];
	}
	sort(a,a+n);
	for(i=n-1;i>=0;i--)
	{
		for(j=0;j<i;j++)
		{
			for(k=j+1;k<i;k++)
			{
				if(a[i]==a[j]+a[k])
				{
					ans++;
					break;
				}
			}
			if(a[i]==a[j]+a[k])
			{
				break;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

结束!!!

猜你喜欢

转载自www.cnblogs.com/wangshiyao/p/11226788.html