标题:北航1731,怎么就超时?
只看楼主
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
得分:0 
估计他说的是 '\n' 的问题

我就是真命天子,顺我者生,逆我者死!
2011-09-17 13:59
nextleave
Rank: 2
等 级:论坛游民
帖 子:52
专家分:92
注 册:2011-9-12
得分:0 
回复 11楼 BlueGuy
咱一直讨论的好像是程序的最简化,而不是输入输出的那点细节吧.赞成楼上的.不要没事乱打击人.
2011-09-17 14:06
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
得分:0 
回复 10楼 nextleave
提示: 该帖被管理员或版主屏蔽
2011-09-17 15:22
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:0 
程序代码:
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *pa,const void *pb)
{
    return *(int *)pa - *(int *)pb;
}
int main()
{   
    int m,n;
    while(scanf("%d%d",&n,&m) && (m||n))
    {       
        int i,j;
        int a[100005] = {0};
        int b[100005] = {0};
        for(i = 0;i<n;i++)
            scanf("%d",&a[i]);
        for(i = 0;i<m;i++)
            scanf("%d",&b[i]);
        qsort(a,n,4,cmp);
        qsort(b,m,4,cmp);
        i = j = 0;
        while(i<m && j<n)
        {
            if(b[i]<a[j])
                break;
            else if(b[i]>a[j])
                j++;
            else
            {i++;j++;}
        }
        if(i == m)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
对于这个题我表示很纠结  总结一下 发这个帖子的原因是 因为我看错了题 题目说是数据个数位100000 而不是数据范围

所以错误的开了100000的散列表 这样数组肯定越界 但是给我的提示是超时 是我想不到是因为越界 浪费了一天时间

还有是最后提交的几次答案错误是因为我把YES 写成了 Yes 我的代码很垃圾但是能过 这个题楼上用了50多MS希望他能把代码贡献一下

                                         
===========深入<----------------->浅出============
2011-09-17 17:01
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
得分:0 
回复 14楼 laoyang103
就你第一次贴的那代码, 我就里面加了个continue;

10 3
1 2 3 4 5 6 7 8 9 10
11 2 3

自己模拟下这组数据就做到了- -

你的代码在输入11的时候就被break了  
后面的2 3就当作n,m的值输入了,然后就TL了
2011-09-17 19:36
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX    100000
int G[MAX], F[MAX], n, m;
int cmp(const void * a, const void * b)
{
    return *(int *)a - *(int *)b;
}
int work()
{
    int i, j;
    qsort(G, n, sizeof(int), cmp);
    qsort(F, m, sizeof(int), cmp);
    for(i = 0, j = 0; i < n && j < m;)
    {
        if(G[i] < F[j])
        {
            i++;
            continue;
        }
        else if(G[i] == F[j])
        {
            i++;
            j++;
            continue;
        }
        else break;
    }
    return j == m;
}
int main()
{
    int i;
    while(scanf("%d %d", &n, &m), n)
    {
        for(i = 0; i < n; scanf("%d", G + i++));
        for(i = 0; i < m; scanf("%d", F + i++));
        if(work()) printf("YES\n"); else printf("NO\n");
    }
    return 0;
}

重剑无锋,大巧不工
2011-09-17 20:42
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
哦,呵呵,和14楼的算法是一样的。
算法消耗的时间主要用来排序了。
草狼提交的代码比较牛,时间很少,占用内存也小的让人配服。
我将排序算法换成堆排序消耗的内存依旧是人家的两倍。

重剑无锋,大巧不工
2011-09-17 20:50
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:10 
很不好意思,刚注意到15楼的回复。试了一下,原来是道水题,数据这么弱。呵呵,下面是我的另一个优化的代码,还是把它当做强数据处理的,时间缩短了30MS, 其实复杂度并没有改变。
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX    100000
int G[MAX], GF[MAX][2], n, fn;
int cmp(const void * a, const void * b)
{
    return *(int *)a - *(int *)b;
}
void format()
{
    int i, j, k;
    qsort(G, n, sizeof(int), cmp);
    GF[0][0] = G[0];
    GF[0][1] = 1;
    for(i = 1, j = 0; i < n; i++)
    {
        if(G[i] == GF[j][0])
            GF[j][1]++;
        else
        {
            GF[++j][0] = G[i];
            GF[j][1] = 1;
        }
    }
    fn = j + 1;
}
int work(int s)
{
    int from, to, i;
    from = 0;
    to = fn - 1;
    while(from <= to)
    {
        i = (from + to) >> 1;
        if(GF[i][0] < s) from = i + 1;
        else if(GF[i][0] > s) to = i - 1;
        else
        {
            if(GF[i][1])
            {
                GF[i][1]--;
                return 1;
            }
            return 0;
        }
    }
    return 0;
}
int main()
{
    int i, s, m;
    while(scanf("%d %d", &n, &m), n)
    {
        for(i = 0; i < n; scanf("%d", G + i++));
        format();
        for(i = 0; i < m; i++)
        {
            scanf("%d", &s);
            if(!work(s)) break;
        }
        if(i == m)
            printf("YES\n");
        else
        {
            printf("NO\n");
            while(getchar() != '\n');
        }
    }
    return 0;
}


重剑无锋,大巧不工
2011-09-17 22:33
草狼
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:577
专家分:1040
注 册:2010-4-6
得分:10 
回复 18楼 beyondyf
被发现了
2011-09-17 23:08



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-350132-1-1.html




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

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