POJ1250解题报告补
发布日期:2021-07-24 21:57:43
浏览次数:16
分类:技术文章
本文共 4508 字,大约阅读时间需要 15 分钟。
参考我前一篇文章有详细解析
关于本篇
在这篇里,我对POJ1250想到了新的解题方法,同时在使用新方法的时候调试了许多有意思的bug,与诸君分享
新方法思路
我用specialized二值数组去接看出现的字符是否为第一次出现,如果第一次出现,就把specialized[s[i]-'A']置为true,(这里用了技巧,用大写字符减去‘A’得到唯一的一个数字)然后再判断是否房间空,房间不空就把trek[s[i-'A']]置为true,这样就标志着s[i]入住了,如果不入住就把ans++,ans存储离开的人数详细看着代码思考,这里只是简单介绍
代码
#include#include using namespace std;#define max 100bool specialized[max];bool trek[max];int main(){ int n; string s; while(cin>>n &&n){ cin>>s; memset(specialized,false,sizeof(specialized));//这两行代码不能放错地方 memset(trek,false,sizeof(trek)); int ans=0; //初始化ans for(int i=0;i 0){ trek[s[i]-'A']=true; n--; continue; } else { ans++; continue; } } if(specialized[s[i]-'A']){ //判断第二次出现是住的客人还是离开的客人 if(trek[s[i]-'A']){ n++; } } } if(!ans) cout<<"All customers tanned successfully."<
上个版本实测通过,同时还有很多版本,比如说对里面的if-else 进行修改啥的。。。
又想到一个可以AC的版本,故放之于博客
代码:#include//亮点已经加注释#include using namespace std;#define max 257 //因为字符ASCII码值不会大于255,所以定义为257即可满足bool specialized[max];bool trek[max];int main(){ int n; string s; while(cin>>n &&n){ cin>>s; memset(specialized,false,sizeof(specialized)); memset(trek,false,sizeof(trek)); int ans=0; for(int i=0;i 0){ trek[s[i]]=true; n--; continue; } else { ans++; continue; } } if(specialized[s[i]]){ if(trek[s[i]]){ n++; } } } if(!ans) cout<<"All customers tanned successfully."<
下面是找bug过程,各位有兴趣的小伙伴可以去想一下为什么这些代码过不了?
思考题找bug
以下代码都是博主自己在AC过程中改错的代码,觉得错的比较有意思,故拿出来和诸君分享,各位有兴趣可以去试一下为什么错了。(答案附在文章最后)
代码1:
#include#include using namespace std;#define max 100bool specialized[max];bool trek[max];int main(){ int n; string s; while(cin>>n &&n){ cin>>s; memset(specialized,false,sizeof(specialized)); memset(trek,false,sizeof(trek)); int ans=0; for(int i=0;i 0){ trek[s[i]-'A']=true; n--; } else { ans++; } } if(specialized[s[i]-'A']){ if(trek[s[i]-'A']){ n++; } } } if(!ans) cout<<"All customers tanned successfully."<
代码2:
#include#include using namespace std;#define max 100bool specialized[max];bool trek[max];int main(){ int n; string s; memset(specialized,false,sizeof(specialized)); memset(trek,false,sizeof(trek)); while(cin>>n &&n){ cin>>s; int ans=0; for(int i=0;i 0){ trek[s[i]-'A']=true; n--; continue; } else { ans++; continue; } } if(specialized[s[i]-'A']){ if(trek[s[i]-'A']){ n++; } } } if(!ans) cout<<"All customers tanned successfully."<
代码3:
#include#include using namespace std;#define max 100bool specialized[max];bool trek[max];int main(){ int n; string s; memset(specialized,false,sizeof(specialized)); memset(trek,false,sizeof(trek)); while(cin>>n &&n){ cin>>s; int ans=0; for(int i=0;i 0){ trek[s[i]-'A']=true; n--; } else { ans++; } } if(specialized[s[i]-'A']){ if(trek[s[i]-'A']){ n++; } } } if(!ans) cout<<"All customers tanned successfully."<
思考题解答
代码1:错在for循环中的两个if在上个if执行玩了之后specialized的值会更改,所以下面那个if可能会执行,这样导致结果错误。
代码2:specialized,trek布尔数组初始化地方不对,按那种写法,第二次输入字符串再判断的时候会用到第一次字符串的判断留下的在specialized和trek数组的结果,所以要在每次循环时都初始化一下
代码3:代码1和代码2的综合错误
还有说个题外话:
if-else 结果可以用 if结构加上 continue来代替另外if(!flag) 等价于 if(flag==0)
end
seen 2015-09-14
转载地址:https://blog.csdn.net/qq_23100787/article/details/48438229 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月17日 23时36分37秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
你不得不了解的深度学习知识(一)
2019-04-26
你不得不了解的深度学习知识(二)
2019-04-26
AI算法之Encoder-Decoder 和 Seq2Seq
2019-04-26
AI算法之Attention机制
2019-04-26
人体口罩佩戴检测实战
2019-04-26
[实战]200类鸟类细粒度图像分类
2019-04-26
【实战】英文垃圾短信分类
2019-04-26
FFmpeg初遇见_基本命令
2019-04-26
Urbansound8k声音分类深度学习实战
2019-04-26
pytorch版本下的yolov3训练实现火焰检测
2021-06-29
yolov4训练自己的数据集实现安全帽佩戴检测
2021-06-29
EfficientDet训练自己的数据集实现抽烟检测
2021-06-29
【工具篇】10分钟快速上手git与github
2021-06-29
【开发篇】10分钟快速上手spring boot
2021-06-29
【开发篇】10分钟快速spring boot+react前后端分离
2021-06-29
【Leetcode刷题篇】leetcode203 移除链表元素
2021-06-29
【Leetcode刷题篇】leetcode938 二叉搜索树的范围和
2021-06-29
【Java网络编程与IO流】Java中BIO、NIO、AIO的区别是什么?
2021-06-29
【Leetcode刷题篇】leetcode136 只出现一次的数字
2021-06-29
spring boot整合thymeleaf,支持JSP和HTML页面开发
2021-06-29