| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 501 人关注过本帖, 1 人收藏
标题:超时了,求大神指点更好的解题思路
只看楼主 加入收藏
ma815841356
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2015-5-3
结帖率:100%
收藏(1)
已结贴  问题点数:11 回复次数:4 
超时了,求大神指点更好的解题思路
我用了快排,但提交后还是超时了,请问有更好的解决方法吗?

题目如下:

图片附件: 游客没有浏览图片的权限,请 登录注册


代码如下:
#include<stdio.h>
#include<stdlib.h>

int a[1000000];

int cmp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}

int main()
{
    int T,n,k,i,t,x,y,temp;

    scanf("%d",&T);

    while(T--)
    {
        scanf("%d%d",&n,&k);

        for(i=0; i<n; i++)
            a[i]=0;

        for(i=1; i<=k; i++)
        {
            scanf("%d%d",&x,&y);
            for(t=x-1; t<=y-1; t++)
                a[t]++;
        }

        qsort(a,n,sizeof(int),cmp);

        printf("%d\n",a[n/2]);

    }

    return 0;
}
搜索更多相关主题的帖子: return include 
2015-05-12 22:21
helloUJS
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:168
专家分:731
注 册:2013-3-27
收藏
得分:0 
超时的原因可能是因为排序,实际上不需要完全排序,只要排到一半的顺序就可以了,下面的代码供参考,不知是否超时:
#include<stdio.h>
int a[1000000];

void  sort(int *a,int n)
{
    int i,j,k,t,m,left,right;
    m=n/2;
    k=0;
    left=0;
    right=n-1;
    while(1)
    {
        k=left;
        for(j=left+1;j<=right;j++)
           if(a[j]<a[left])
           {
                k++;
                if(j>k)
                   {t=a[k]; a[k]=a[j];  a[j]=t;}
            }
        t=a[left]; a[left]=a[k];a[k]=t;
        if(k==m)
            return ;
        else if(k<m) left=k+1;
        else right=k-1;

   }

}
   
int main()
{
    int T,n,k,i,t,x,y,temp;

    scanf("%d",&T);

    while(T--)
    {
        scanf("%d%d",&n,&k);

        for(i=0; i<n; i++)
            a[i]=0;

        for(i=1; i<=k; i++)
        {
            scanf("%d%d",&x,&y);
            for(t=x-1; t<=y-1; t++)
                a[t]++;
        }
        
        sort(a,n);
        printf("%d \n",a[n/2]);

    }

    return 0;
}
2015-05-13 01:18
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:11 
楼上的排序函数写的不错,不过就效率而言它与快排是一个级别的。

你们的算法中真正浪费时间的部分不是最后的排序,而是之前操作的统计。即

        for(i=1; i<=k; i++)
         {
             scanf("%d%d",&x,&y);
             for(t=x-1; t<=y-1; t++)
                 a[t]++;
         }

这部分代码。这部分的时间复杂度是O(n * k)。

你们的问题分析还不够深入,模型的构建太直白。也没有掌握算法效率分析的量化手段,建议在这方面加强学习训练。

试试这段代码。
程序代码:
#include <stdio.h>
#include <stdlib.h>

int cmp(const void * a, const void * b)
{
    return *(short int *)a - *(short int *)b;
}

short int g[1000002];

int main()
{
    int t, n, k, a, b, i;

    for(scanf("%d", &t); t--; printf("%d\n", g[(n + 1) >> 1]))
    {
        for(scanf("%d%d", &n, &k), i = 1; i <= n; g[i++] = 0);
        for(i = k; i-- && scanf("%d%d", &a, &b); g[a]++, g[b + 1]--);
        for(a = 0, i = 1; i <= n; i++) a += g[i], g[i] = a;
        qsort(g + 1, n, sizeof(g[0]), cmp);
    }

    return 0;
}

重剑无锋,大巧不工
2015-05-13 07:18
maqiangdemo
Rank: 2
等 级:论坛游民
帖 子:78
专家分:98
注 册:2014-2-26
收藏
得分:0 
恩,学习了快排
2015-05-14 08:38
helloUJS
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:168
专家分:731
注 册:2013-3-27
收藏
得分:0 
三楼的思路巧妙,值得学习
2015-05-14 10:35
快速回复:超时了,求大神指点更好的解题思路
数据加载中...
 
   



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

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