zoj 1101 Gamblers 为什么总是WA?

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=101

一道被各种人认为简单题的题,但是我WA了将近10次,我觉得有必要写出来,以供有需要的人参考。

 

这道题就是暴力解,需要的只是少量的优化,但是在优化过程中还是出了很多问题,其中的逻辑需要很严密。从另一方面可以看到ZOJ内部的测试数据很bt。好了,下面就贴上我改了很多仍然WA的代码,照着代码来分析一些容易出错的地方。

 

好了,我们一点点慢慢看:

  1. sort,我没有做过实验,不sort会不会错,不过题目没有明确表示input数据是排序过的,虽然example是不降序排列的
  2. i循环处和j循环处,这两个地方都是因为没有充分考虑负数情况。在i循环处,i>=3是基于bets[i]是三者之和,因此习惯性的以为它(bets[i])是最大的,但是由于可以有负数,因此它不一定是最大的,只能确定它一定不是最小的。
  3. 在j循环处,由于存在负数bet,所以i不是最大的,所以j非常可能比i大(循环中的逻辑决定了j>k>l,所以只需要在j循环中修改即可)。由于这个地方的改动,需要在k循环内部再加入if(i==j || i==k )的判断
  4. 循环内部比较判断处。if(tmp2 == bets[j] || tmp2 == bets[k])。这样的判断初看貌似是对的,至少我是这么觉得,但是忘记了可能bets[k] == bets[l]的情况。其他情况不会出现问题,因为bets[j] >= bets[k] >= bets[l](j>k>l)。所以判断应该取消,不需要判断。

好了,大致就这几个地方,下面贴一下最终acc的代码,可能依然有逻辑错误,欢迎指正^^。

 

至于

#ifndef ONLINE_JUDGE

    freopen("input.txt", "rt", stdin);

    freopen("output.txt", "wt", stdout);

#endif

如果要自己本地执行代码,就新建个INPUT.TXT,或者直接注释掉这几句。

还有我用了GOTO,我只是比较懒的在每层loop里面做判断,所以请谅解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值