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

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

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

#include <iostream> #include<stdio.h> #include<vector> #include<algorithm> using namespace std; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "rt", stdin); freopen("output.txt", "wt", stdout); #endif long n; long tmp; vector<long> bets; cin >> n; while(n!=0) { bets.clear(); for(long i=0;i<n;i++) { cin >> tmp; bets.insert(bets.end(),tmp); } //Please sort, we never know whether the data is sorted, although the example is. sort(bets.begin(), bets.end()); bool flag = false; int i; /********************************************** //The loop exists one important problem: //There are Negative bets. So the j,k bets may larger than i bets! //So not start from j=i-1 //It should loop through all bets /********************************************************** //Ok, there are another problem: i>=3 //Think when bets[0] is a very negative number, so we need some positive j and k when l = 0 //The situation i=1 exists. So the code should be i>=1 */ for(i=n-1;i>=3;i--) for(int j=i-1;j>=2;j--) for(int k=j-1;k>=1;k--) { long tmp2 = bets[i] - bets[j] - bets[k]; //Here also exist problem: //When two bets are the same(bets[k] == bets[l]) //The answer will lose. because we just continue if(tmp2 == bets[j] || tmp2 == bets[k]) { continue; } for(int l = k-1;l>=0;l--) { if(tmp2 == bets[l]) { flag = true; goto OUTER; } else if(tmp2 > bets[l]) { break; } } } OUTER: if(flag) { cout << bets[i] << endl;; } else { cout << "no solution" <<endl; } cin >> n; } return 0; }

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

  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的代码,可能依然有逻辑错误,欢迎指正^^。

#include <iostream> #include<stdio.h> #include<vector> #include<algorithm> using namespace std; int main() { #ifndef ONLINE_JUDGE freopen("input.txt", "rt", stdin); freopen("output.txt", "wt", stdout); #endif long n; long tmp; vector<long> bets; cin >> n; while(n!=0) { bets.clear(); for(long i=0;i<n;i++) { cin >> tmp; bets.insert(bets.end(),tmp); } sort(bets.begin(), bets.end()); bool flag = false; int i; for(i=n-1;i>=1;i--) for(int j=n-1;j>=2;j--) for(int k=j-1;k>=1;k--) { long tmp2 = bets[i] - bets[j] - bets[k]; if(i==j || i==k ) { continue; } for(int l = k-1;l>=0;l--) { if(tmp2 == bets[l]) { flag = true; goto OUTER; } else if(tmp2 > bets[l]) { break; } } } OUTER: if(flag) { cout << bets[i] << endl;; } else { cout << "no solution" <<endl; } cin >> n; } return 0; }

至于

#ifndef ONLINE_JUDGE

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

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

#endif

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

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

zoj 1101 Gamblers 为什么总是WA?相关推荐

  1. POJ ZOJ题目分类

    POJ,ZOJ题目分类(多篇整合版,分类很细致,全面) 标签: 题目分类POJ整理 2015-04-18 14:44 1672人阅读 评论(0) 收藏 举报 本文章已收录于: 分类: ACM资料(5) ...

  2. POJ,ZOJ题目分类(多篇整合版,分类很细致,全面)

    水题: 3299,2159,2739,1083,2262,1503,3006,2255,3094 初级: 一.基本算法:        (1)枚举 (1753,2965)       (2)贪心(13 ...

  3. ZOJ 题目分类,学校的一个巨巨做的。

     DP: 1011      NTA                    简单题 1013      Great Equipment        简单题 1024      Calendar ...

  4. pku,zju题目分类

    哎呦喂,直接ctrl+A了.话说浙江大学的题还见过的呢.. 公告: [意见反馈][官方博客]   ural pku Zju 题目分类 收藏   感谢 mugu 的提供.... Ural Problem ...

  5. c语言大小写字母互换1005,1005 Jugs,1005jugs

    1005 Jugs,1005jugs 辗转相减,新手入门题.两个容量的灌水题,无所谓最优解. 1 #include 2 3 intmain(){4 intA,B,T,sA,sB;5 while(sca ...

  6. poj题目详细分类及算法推荐题目

    DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  1024   Calendar Game       简单题  ...

  7. ACM POJ 题目分类(完整整理版本)

    DP: 1011   NTA                 简单题  1013   Great Equipment     简单题  1024   Calendar Game       简单题   ...

  8. PUK ACM题目分类

    acm之pku题目分类 对ACM有兴趣的同学们可以看看 DP:  1011   NTA                 简单题  1013   Great Equipment     简单题  102 ...

  9. ZOJ POJ题目分类

    ZOJ题目分类 初学者题:1001 1037 1048 1049 1051 1067 1115 1151 1201 1205 1216 1240 1241 1242 1251 1292 1331 13 ...

  10. ZOJ 1610 Count the Colors

    段树:延迟标志+暴力更新 我记得刚学段树做的时候这个话题WA一个版本.....如今,每分钟获得.... Count the Colors Time Limit: 2 Seconds      Memo ...

最新文章

  1. TensorFlow(9)(项目)人马图像分类(卷积神经网络)
  2. 【 MATLAB 】使用 residuez 函数求 z 反变换的几个案例分析
  3. (0034) iOS 开发之UIView动画(过渡效果)
  4. 大型网站SEO执行策略
  5. 有许多部分没有在cgroup中显示啊,current/high/low/min等等
  6. strtol() 字符串转长整型函数
  7. h5 android数字键盘,【笔记】移动端H5数字键盘input type=number的处理(IOS和Android)...
  8. MySQL进阶操作之视图
  9. 平衡二叉搜索树的创建
  10. 搜狐html源码,使用css和html模仿搜狐页面
  11. 定时任务 Wpf.Quartz.Demo.3
  12. Git提交代码的流程
  13. oracle查看数据库文件大小
  14. 最佳实践 | 联通数科基于 DolphinScheduler 的二次开发
  15. 数据分析最有用的25个Matplotlib图表
  16. 市场需求上升,网络安全硬件平台行业逐渐占据主导地位
  17. 卧槽!​微信电脑版可以浏览朋友圈了!!
  18. 几个大学生实用的网站推荐
  19. c++数据结构小助手 : 可视化树与图工具
  20. Codeforces Round #561 (Div. 2)-E. The LCMs Must be Large

热门文章

  1. 校验、加密、压缩、哈希值的区别,我老是弄混,现在总结一下
  2. 清理谷歌浏览器注册表_Win10系统下注册表chrome残留无法删除
  3. 开路电压法与电流积分法
  4. 深入理解Flash的沙箱 – Application Domains
  5. MQ消息队列(五)——RabbitMQ进阶 MQ集群+集群的部署+集群的扩容
  6. 【信号与系统】指数信号与正弦信号
  7. JFrame中添加背景音乐
  8. 自建公众号服务器开发教程,01-微信公众号开发入门篇
  9. mysql如何上传音频文件_关于音频文件的上传
  10. python不解压直接提取文件_不解压直接读取压缩包中的文件