| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1150 人关注过本帖
标题:请大家指点指点关于程序超时问题
只看楼主 加入收藏
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:5 
上来发现版主已经发代码了, 不过既然我说过要发代码的, 就贴在这里了,
思路和版主的一样,
先排序,版主用的是库函数,  我用的是冒泡,(库函数会不会快一点?)
再找点, 版主用的是对半,我是直接找一遍数组,(对半算法肯定要快些,)
再计算结果
程序代码:
#include <stdio.h>
#define SWAP(a, b, t) t = (a), (a) = (b), (b) = (t)
int main()
{
    int v[1000], k, s;
    int i, j, t, p, temp;
    int c, n;
  
    scanf("%d", &t);
    while(t--) {
        scanf("%d%d",&n, &k);
        for (i = 0; i < n; i++)
            scanf("%d", &v[i]);
        p = 0;
        if (n >= 3) {
            for (i = 0; i < n; i++)  // 排序
                for (j = i+1; j < n; j++)
                    if (v[i] > v[j])
                        SWAP(v[i], v[j], temp);
      
            s = v[0] + v[1];
            c = 2;
            for (i = 2 ; i < n; i++, c++)  // 找点
                  if ((s + v[i]) >= k)
                      break;       
            if (c != n)                                  // c的值就是那c个数中任意三个数的组合都小于k
                p = n*(n-1)*(n-2)/6 - c*(c-1)*(c-2)/6;   // 计算, 简单的组合计算。  从n个数中取三个数的组合减去c个数中取三个数的组合。   
        }
        printf("%d\n", p);
        }
    return 0;
}
                  

  
2014-05-14 23:35
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
已知:V (1 to n)

nidea = 0;
for (i = 1 to n -2 )
    for (j = i + 1 to n - 1)
        for (k = j + 1 to n) {
            value = V[i] + V[j] + V[k];
            if (value >= k)
                ++nidea;
        }
printf(nidea);

梦想拥有一台龙芯3A-4000
2014-05-15 08:53
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
收藏
得分:0 
回复 12 楼 ditg
你的和楼主的是一样的, 时间复杂度是n^3,  楼主说超时了, 如果n是2000,那循环是80亿次,最外层少两次也要79亿次
我和版主的时间主要是花在排序上,
冒泡最坏是n^2, 4百万次, 用库函数的话我不知道会不会比冒泡会快点。
2014-05-15 09:16
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
有道理,看来我跟楼主水平一样,都只会遍历法,呵呵

梦想拥有一台龙芯3A-4000
2014-05-15 09:43
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
qsort 相比冒泡何止是快,据我实测10万个整数排序,约快80倍以上。
2014-05-15 09:50
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
收藏
得分:0 
pangshch 的代码确实很快。但 c 变量纯属多余,改为以下代码更简洁:
            ......
            s = v[0] + v[1];
            for (i = 2 ; i < n; i++)  // 找点
                  if ((s + v[i]) >= k) {
                      p = n*(n-1)*(n-2)/6 - i*(i-1)*(i-2)/6;   // 计算, 简单的组合计算。  从n个数中取三个数的组合减去c个数中取三个数的组合。   
                      break;
                  }
        }
        ......
2014-05-15 10:09
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
优化算法千千万,搜索方式万万千,还是让楼主自己研究吧,呵呵

梦想拥有一台龙芯3A-4000
2014-05-15 10:37
岑吼吼
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-5-10
收藏
得分:0 
回复 10 楼 azzbcc
果然算法很重要,要我想这样的很长时间也想不出来啊
谢谢谢谢
2014-05-15 10:53
岑吼吼
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-5-10
收藏
得分:0 
回复 14 楼 ditg
我现在还很水的,还需要多多研究研究
2014-05-15 10:55
岑吼吼
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-5-10
收藏
得分:0 
回复 11 楼 pangshch
刚下课回来就看到了两组代码可以参考.谢谢
2014-05-15 10:57
快速回复:请大家指点指点关于程序超时问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023273 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved