| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1267 人关注过本帖
标题:Tyvj的一个题,代码不知道哪里错了,求帮忙查看
只看楼主 加入收藏
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
结帖率:88.89%
收藏
已结贴  问题点数:20 回复次数:8 
Tyvj的一个题,代码不知道哪里错了,求帮忙查看
这是 Tyvj 第四个题P1003(应该是第四个简单的),就是得不到AC。
我真心不知道哪里出错了,谁有耐心能帮忙看看,我的为什么错了,感激不尽!!

题目描述:
越野跑From huangrl
背景 Background
成成第一次模拟赛 第二道
描述 Description
    为了能在下一次跑步比赛中有好的发挥,贝茜在一条山路上开始了她的训练
。贝茜希望能在每次训练中跑得尽可能远,不过她也知道农场中的一条规定:
奶牛独自进山的时间不得超过M秒(1 <= M <= 10,000,000)。

    整条山路被贝茜划分成T个长度相同的小段(1 <= T <= 100,000),并且,
贝茜用S_i表示第i个小段的路况。S_i为u,f,d这3个字母之一,它们分别表示
第i个小段是上坡、平地,或是下坡。

    贝茜要花U秒(1 <= U <= 100)才能跑完一段上坡路,跑完一段平地的耗时是
F秒(1 <= F <= 100),跑完一段下坡路要花D秒(1 <= D <= 100)。注意,沿山路
原路返回的时候,原本是上坡路的路段变成了下坡路,原本是下坡路的路段变成
了上坡路。

    贝茜想知道,在能按时返回农场的前提下,她最多能在这条山路上跑多远。
输入格式 InputFormat
输入格式:

* 第1行: 5个用空格隔开的整数:M,T,U,F,以及D

* 第2..T+1行: 第i+1行为1个字母S_i,描述了第i段山路的路况
输出格式 OutputFormat
输出格式:

* 第1行: 输出1个整数,为贝茜在按时回到农场的前提下,最多能跑到多远
样例输入 SampleInput [复制数据]
13 5 3 2 1
u
f
u
d
f

样例输出 SampleOutput [复制数据]
3

数据范围和注释 Hint
输入说明:

    贝茜跑步的最大耗时为13秒(这么短...),她跑步的山路一共被划成5段。
贝茜跑完一段上坡路的耗时为3秒,平地为2秒,下坡路为1秒。山路各段的走向
如下图所示:

 _/\_
/

输出说明:

    贝茜跑完山路的前3段,然后返回,总耗时为3 + 2 + 3 + 1 + 2 + 1 = 12秒,
    只比她能在外面呆的时限少1秒。如果她跑得更远,就无法按时回到农场。


这是第一次代码:

程序代码:
#include<stdio.h>
int main(void)
{
    int    M, T, U, F, D;
    char   ch;
    int    i;
    int    flag;
    int    maxi;
    int    s;

    s = 0;
    flag = 1;
    scanf("%d%d%d%d%d", &M, &T, &U, &F, &D);    
    for (i = 1; i <= T; i++)
    {
        getchar();
        ch = getchar();
        if ((ch == 'u') || (ch == 'd'))
        {
            s += U + D;
        }
        else
        {
            s += 2 * F;
        }
        if (flag)
        {
            if (s <= M)
            {
                maxi = i;
            }
            else
            {
                flag = 0;
            }
        }
    }

    printf("%d", maxi);

    return(0);
}


只得到20分:
测试数据 #1: Accepted, time=0ms, mem=636KB, score=10
测试数据 #2: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #3: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #4: Wrong Answer, time=0ms, mem=636KB, score=0
测试数据 #5: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #6: Accepted, time=0ms, mem=636KB, score=10
测试数据 #7: Wrong Answer, time=0ms, mem=636KB, score=0
测试数据 #8: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #9: Wrong Answer, time=0ms, mem=636KB, score=0
测试数据 #10: Wrong Answer, time=0ms, mem=636KB, score=0
Time = 0ms Mem = 640KB Score= 20

改了一下,换了个思路,第二次代码:
程序代码:
#include<stdio.h>
#include<malloc.h>
int main(void)
{
    int    M, T, U, F, D;
    char   *p1 = NULL;
    int    *p2 = NULL;
    int    i;
    int    s = 0;

    scanf("%d%d%d%d%d", &M, &T, &U, &F, &D);
    p1 = (char *)malloc(T * sizeof (char));
    p2 = (int *)malloc(T * sizeof (int));
    for (i = 0; i < T; i++)
    {
        getchar();
        *(p1 + i) = getchar();
        if (*(p1 + i) == 'f')
        {
            s += 2 * F;
        }
        else
        {
            s += U + D;
        }
        *(p2 + i) = s;
    }
    for (i = 1; (i < T) && (*(p2 + i -1) <= M); i++)
    {}
    i--;
    printf("%d", i);
    free(p1);
    free(p2);
    return(0);
}



这次好点,50分:
测试数据 #1: Accepted, time=0ms, mem=636KB, score=10
测试数据 #2: Accepted, time=0ms, mem=640KB, score=10
测试数据 #3: Wrong Answer, time=0ms, mem=636KB, score=0
测试数据 #4: Accepted, time=0ms, mem=640KB, score=10
测试数据 #5: Accepted, time=0ms, mem=640KB, score=10
测试数据 #6: Accepted, time=0ms, mem=640KB, score=10
测试数据 #7: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #8: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #9: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #10: Wrong Answer, time=0ms, mem=640KB, score=0
Time = 0ms Mem = 640KB Score= 50

谁有耐心能帮忙查看下,为什么错了,感激不尽!
搜索更多相关主题的帖子: 奶牛 农场 
2014-02-27 22:56
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
第一段代码应该把maxi初始化为0。贝茜是有可能连第一段也跑不完的。第二段没看就不发表评论了。

突然想到一个以前没想过的问题,对于这种不需要读完所有输入数据就可能得到结果的问题有必要把剩下的输入也读取么?

帮我提交测试一下这段代码,并反馈一下结果。

程序代码:
#include <stdio.h>

int main()
{
    int m, t, c[128], r;
    scanf("%d%d%d%d%d\n", &m, &t, &c['u'], &c['f'], &c['d']);
    c['u'] = c['d'] += c['u'];
    c['f'] <<= 1;
    for(r = 0; t-- && (m -= c[gets((char *)c)[0]]) >= 0; r++);
    printf("%d\n", r);
    return 0;
}

重剑无锋,大巧不工
2014-02-28 00:05
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 2楼 beyondyf
maxi 初始化了, 也是20分
测试数据 #1: Accepted, time=0ms, mem=636KB, score=10
测试数据 #2: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #3: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #4: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #5: Wrong Answer, time=0ms, mem=636KB, score=0
测试数据 #6: Accepted, time=0ms, mem=640KB, score=10
测试数据 #7: Wrong Answer, time=0ms, mem=636KB, score=0
测试数据 #8: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #9: Wrong Answer, time=0ms, mem=640KB, score=0
测试数据 #10: Wrong Answer, time=0ms, mem=640KB, score=0
Time = 0ms Mem = 640KB Score= 20

未知令人期待!
2014-02-28 00:22
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 2楼 beyondyf
测试数据 #1: Accepted, time=0ms, mem=636KB, score=10
测试数据 #2: Accepted, time=0ms, mem=636KB, score=10
测试数据 #3: Accepted, time=0ms, mem=640KB, score=10
测试数据 #4: Accepted, time=0ms, mem=640KB, score=10
测试数据 #5: Accepted, time=0ms, mem=640KB, score=10
测试数据 #6: Accepted, time=0ms, mem=640KB, score=10
测试数据 #7: Accepted, time=0ms, mem=640KB, score=10
测试数据 #8: Accepted, time=0ms, mem=636KB, score=10
测试数据 #9: Accepted, time=0ms, mem=636KB, score=10
测试数据 #10: Accepted, time=0ms, mem=640KB, score=10
Time = 0ms Mem = 640KB Score= 100

这是版主的结果
膜拜一个

未知令人期待!
2014-02-28 00:24
klapset
Rank: 4
等 级:业余侠客
威 望:2
帖 子:71
专家分:234
注 册:2014-2-27
收藏
得分:2 
哈希表。我个人认为好的编码风格不是天书般,而是简约而不简单的。
2014-02-28 09:20
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:8 
题是挺简单的,但总是不能通过测试是不是有其它原因,比如格式要求,比如是不是要求多次输入?
算了,我也写一个
程序代码:
#include <stdio.h>

int main()
{
    unsigned M,T,U,F,D,t;
    scanf( "%u%u%u%u%u", &M, &T, &U, &F, &D );
    for( t=0; t!=T; ++t )
    {
        char S;
        scanf( " %c", &S );
        if( S == 'f' )
        {
            if( M >= F+F )
                M -= F+F;
            else
                break;
        }
        else
        {
            if( M >= U+D )
                M -= U+D;
            else
                break;
        }
    }
    printf( "%u\n", t );

    return 0;
}

2014-02-28 10:07
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 6楼 rjsp
测试数据 #1: Accepted, time=0ms, mem=636KB, score=10
测试数据 #2: Accepted, time=0ms, mem=640KB, score=10
测试数据 #3: Accepted, time=0ms, mem=636KB, score=10
测试数据 #4: Accepted, time=0ms, mem=636KB, score=10
测试数据 #5: Accepted, time=0ms, mem=640KB, score=10
测试数据 #6: Accepted, time=0ms, mem=636KB, score=10
测试数据 #7: Accepted, time=0ms, mem=640KB, score=10
测试数据 #8: Accepted, time=0ms, mem=640KB, score=10
测试数据 #9: Accepted, time=0ms, mem=636KB, score=10
测试数据 #10: Accepted, time=0ms, mem=640KB, score=10
Time = 0ms Mem = 640KB Score= 100


未知令人期待!
2014-02-28 17:42
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
回复 5楼 klapset
哈希表 没有接触过。。 2楼版主是用的这个方法吗?

未知令人期待!
2014-02-28 17:46
神机军师
Rank: 7Rank: 7Rank: 7
来 自:游鱼潜水
等 级:黑侠
威 望:2
帖 子:202
专家分:542
注 册:2013-12-21
收藏
得分:0 
我找到原因了,,,,
 原因在这里:

getchar();
ch = getchar();

输入格式里面我猜可能在某些行的字母后面有的会有几个空格吧 (真坑

两位版主的字符读取形式:

gets((char *)c)[0]

scanf( " %c", &S );

附上一张坑爹的提交记录 结贴了
图片附件: 游客没有浏览图片的权限,请 登录注册

未知令人期待!
2014-02-28 18:46
快速回复:Tyvj的一个题,代码不知道哪里错了,求帮忙查看
数据加载中...
 
   



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

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