和数问题,求解答~~

dongxu1234 2011-03-30 03:45:47
Description
给定一个整数序列,判断其中有多少个数,等于数列中其他两个数的和。 比如,对于数列1 2 3 4, 这个问题的答案就是2, 因为3 = 2 + 1, 4 = 1 + 3。
Input
第一行是一个整数T,表示一共有多少组数据。 1<= T <= 100
接下来的每组数据共两行,第一行是数列中数的个数n ( 1 <= n <= 100),第二行是由n个整数组成的数列。
Output
对于每组数据,输出一个整数(占一行),就是数列中等于其他两个数之和的数的个数。
Sample Input
2
4
1 2 3 4
5
3 5 7 9 10
Sample Output
2
1
#include<stdio.h>

int select(int a[],int n)
{

int i=0,j=0,k=0;
int temp;
int flag=0;
int s=0;
for(i=0;i<n;++i)
for(j=0;j<n;j++)
{
if(a[i]>a[j])
{
temp=a[i]-a[j];
flag=0;

for(k=0;k<n;k++)
{
if(a[k]==temp&&k!=j)

{
s++;
flag=1;


}
if(flag==1)
break;
}

if(flag==1)
break;
}
}


return s;
}

int main()
{
int a[100];
int b[100];
int n;
int i=0;
int j=0;
int num;



scanf("%d",&num);

for(j=0;j<num;j++)
{

scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
b[j]=select(a,n);
}
for(j=0;j<num;j++)
printf("%d\n",b[j]);



return 0;
}
这是我的代码,但是提交是wronganswer,在vc上编译运行没错啊,难道是是我格式错了,我用数据去检测也没错啊??why??
...全文
219 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ulfsaar 2011-03-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dongxu1234 的回复:]
C/C++ code

#include<stdio.h>

int select(int a[],int n)
{

int i=0,j=0,k=0;
int temp;
int flag=0;
int s=0;
int tag=0;
for(i=0;i<n;++i)
for(j=0;j<n;j++)
{
……
[/Quote]

以下的数据结果不正确
2
2
0 1
3
0 1 -1
1
2
zyl072 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 sbwwkmyd 的回复:]

先排序,再双指针扫,时间复杂度O(n^2)
[/Quote]

先顶一下。

另附上 O(N^2)复杂度的代码,供参考。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

#define MAXN 110
int a[MAXN];

int main()
{
int Cases;
scanf("%d", &Cases);
while (Cases--)
{
int N;
int i, j, k;
scanf("%d", &N);
for (i = 0; i < N; ++i)
{
scanf("%d", &a[i]);
}
sort(a, a + N);

int Ans = 0;
for (k = 0; k < N; ++k)
{
for (i = 0, j = N - 1; i < j; )
{
if (i == k || a[i] + a[j] < a[k])
{
++i;
}
else if (j == k || a[i] + a[j] > a[k])
{
--j;
}
else // a[i] + a[j] == a[k] && i != k && i j != k
{
++Ans;
break;
}
}
}
printf("%d\n", Ans);
}
}
dongxu1234 2011-03-30
  • 打赏
  • 举报
回复

#include<stdio.h>

int select(int a[],int n)
{

int i=0,j=0,k=0;
int temp;
int flag=0;
int s=0;
int tag=0;
for(i=0;i<n;++i)
for(j=0;j<n;j++)
{
if(a[i]>a[j])
{
temp=a[i]-a[j];
flag=0;

for(k=0;k<n;k++)
{
if(a[k]==temp&&k!=j)

{
s++;
flag=1;


}
if(flag==1)
break;
}



if(flag==1)
break;
}
}
//判断有多个0的情况
for(i=0;i<n;i++)
{
if(a[i]==0)
tag++;

}
if(tag>=3)
s+=tag;

return s;
}

int main()
{
int a[100];
int b[100];
int n;
int i=0;
int j=0;
int num;



scanf("%d",&num);

for(j=0;j<num;j++)
{

scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
b[j]=select(a,n);
}
for(j=0;j<num;j++)
printf("%d\n",b[j]);



return 0;
}
这回我改了加上了判断有多个0的情况,感慨是打算先排序在求s,后来感觉复杂应该是一样的
dongxu1234 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qq675927952 的回复:]

你的程序 是怎么处理

1 2 3 0 0 5
这种情况的?
你的程序对 有相同的数 好像就错了。。
[/Quote]啊,好像忘记考虑数列中有零的情况了,,我再试试
qq675927952 2011-03-30
  • 打赏
  • 举报
回复
你的程序 是怎么处理

1 2 3 0 0 5
这种情况的?
你的程序对 有相同的数 好像就错了。。
Ulfsaar 2011-03-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shzhfu 的回复:]
关键应该是3层循环造成超时了。
[/Quote]

楼主跑的结果是WA...
showjim 2011-03-30
  • 打赏
  • 举报
回复
先排序,再双指针扫,时间复杂度O(n^2)
shzhfu 2011-03-30
  • 打赏
  • 举报
回复
关键应该是3层循环造成超时了。
icerainfc522 2011-03-30
  • 打赏
  • 举报
回复
第二个if(flag==1) break; 错误
没有找到所有适合的配对就跳出了j的循环
超级大笨狼 2011-03-30
  • 打赏
  • 举报
回复
这个用递归,代码可以少一多半。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧