回 帖 发 新 帖 刷新版面

主题:难题!你感兴趣吗?请进。

你好!
    我这里有一个问题,想了一天多也找不也好的解决方法,如果你有好的方法,请告诉我好吗?在下不胜感激。
   问题是这样的:
   有n个整数,(1 <= n <= 1000 ),它们的值的范围是-536870912到+536870911(很大吧,呵) ,现在给一个数m,判断m是否是这n个数中的某三个数的和。

我写了关于这个问题的函数,可惜,速度不够快,其体如下:
/***************************************************************************
*函数原型:int compare(long *p, int n, long N)  
*函数功能:p指向从小到大的有序数组,n为该数组的个数,查找p指向的数组中是否有
*          三个元素的和为N
*返回值:  若存在则返回 1,否则返回 0;
****************************************************************************/

int compare(long *p, int n, long N)
{
    int i = 0;
    int j = 0;
    int k = 0;
    long temp = 0;

    for (i=0; i<n-2; i++)
        for (j=i+1; j<n-1; j++)
        {
            temp = N - p[i] - p[j];//计算N与任意两个数的差值;
            for (k=n-1; k>j; k--)  //将差值与其它的每一个值进行比较;
            {
                if (temp == p[k])
                {
                    return 1;
                }
                if (temp > p[k])
                {
                    break;
                }
            }
        }
    return 0;
}


你有什么更好的方法吗?

回复列表 (共11个回复)

11 楼

在此先谢谢各位了,这是浙江大学题库上的一题,很久以前做的,差不多忘了是什么思路了,有兴趣的话去做做,网址是:http://acm.zju.edu.cn/show_problem.php?pid=1101   做不出的话我们再讨论一下,我通过了

我来回复

您尚未登录,请登录后再回复。点此登录或注册