热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ACM系统中经常遇到的问题

ACM系统中经常遇到的问题貌似新人们总会遇到几个问题,提一下吧。1.64Bit整型的问题2.大数组RE的问题3.cincout的TLE危险4.scanf的\n遗留问题以及get

ACM系统中经常遇到的问题


貌似新人们总会遇到几个问题,提一下吧。

1. 64Bit整型的问题
2. 大数组RE的问题
3. cin/cout的TLE危险
4. scanf的\n遗留问题以及gets的RE问题
5. 精度问题
6. 其它还有一些建议

--

1. 64Bit整型的问题
这个东西比较纠结阿。一般来说
在VC下面,定义的时候要用__int64
用g++/gcc的时候,则应该用long long定义
在Windows下面,输入输出的时候要用%I64d这个格式
在类Unix(包括Solaris/Linux等)下面,输入输出的时候要用%lld这个格式
对于各类OJ,不妨自己在A+B这道题上试试
参加比赛的时候,务必向工作人员或者judge问清楚编译环境
——包括操作系统和编译器。

2. 大数组RE的问题
emingCup的时候就有队伍遇到这个问题
自己运行的时候都RE还交过来。
这个涉及到编译器对不同类型变量的内存分配规则。
在C/C++中
对于在函数内定义的变量(包括main()函数)
都是在程序的栈空间内分配的(这个空间相对有限)
如果定义一个内存使用量达到MB级别的数组
一般就会Stack Overflow,RE了。
所以遇到大数组的时候建议大家都定义成全局变量
这样就可以在编译的时候就为它们分配好足够的空间。
更具体的可以参见luoxi同学的这篇日志。
http://hi.baidu.com/luoxi0209/blog/item/50364c39b1c2622597ddd8b0.html 
另外,想起snoopy大牛的建议,如果你的算法递归稍会微深一点,那就考虑优化,或者写非递归的吧。

3. cin/cout的TLE危险
C++中cin/cout这两个预定义好的变量内部都有个缓冲区
对于实际使用是非常有好处的
但是不适合用来做acm:它们常常会导致TLE
原因大概是没有及时把它们的缓冲区输出吧。
特别要注意的是不止cin/cout
其它所有的C++流都可能有缓冲区
所以做题目的时候,特别是有大量I/O的题目
尽量使用scanf和printf (它们的格式化输出功能非常好)。
对于字符串,string确实很好用,但是只能用cin输入
必要的时候,变通的方法是
定义一个比较大的char数组,scanf到这个数组,然后再赋给string
char a[1024];
string b;
scanf("%s", a);
b = string(a);
输出的时候就:
printf("%s", b.c_str());

4. scanf的\n遗留问题以及gets的RE问题
有些题目的输入格式很BT阿
scanf默认用空白字符(包括空格,tab,回车,换行)作为分隔符
在输入完一个数据以后,接下来的空白符不会被处理
会继续留在系统的输入缓冲区(特别是\n)
所以如果这个时候要输入一个字符,很可能的就是输入的是\n
这时候可以用一个getchar()来处理这个\n。
有时候需要读入完整的一行,因为scanf的默认分隔符问题
所以有时候需要换个读入方式
而gets的RE问题是这样的
gets遇到\n或者EOF才会结束
所以可能就会导致数组越界错误
因此尽量不要使用,
推荐使用scanf("%1024[^\n]", a)
或者 fgets(a, 1024, stdin);
限制输入的字符数。

5. 精度问题
对于float/double的比较,通常可能会有舍入误差
(比如0.1这个东西在IEEE754标准下永远不可能精确存储)
导致本来应该相等的不相等,所以建议这样
先定义一个常量,比如精度在10^-9这个额度(要根据具体问题判断这个额度!)
#define EPS (1e-9)
然后用这样一个比较函数:
int cmpDouble(double a, double b){
if(fabs(a - b)
else if(a - b > 0) return 1; // a > b
else return -1; // a
}
对于float/double的取整也很有技巧:
floor和ceil不一定能给你你想要的结果(why?)
对于一个double类型的a,想想这些表达式的意义:
(提示:取(?)整,四舍五入)
(int)(a + EPS)
(int)(a + EPS + 0.5)
以上对于正数成立,对于负数呢?最好还是自己想想,嗯。

其它还有一些建议,比如
~ 定义数组的时候开大些
比如题目告诉最多5000个数据,那就开到5010或者更多一些吧

~ 不要太依赖vc的调试功能吧
比赛的时候大多是没这个条件的,学习gdb,或者用printf什么的自己动手调。

~ 学习vim吧,用熟了它你才会知道什么叫做编辑器。

~ 学习STL吧!
最起码一些简单的算法和容器得会使阿,不然你很吃亏的。那些代码都是最牛的那些人写的东西,效率绝对不会比你写的代码差——而且还省大量coding的时间。
举个例子说,对于int a[5] = {3,4,5,2,7};
sort(a, a+5);以后a就是升序了。
如果要降序,自己写一个简单的比较函数就好了。
sort用的是随机化快速排序,绝对比你随便写的qsort以及stdlib.h里面的qsort牛B(它还要一个很费解的比较函数)。同样还有使用归并的stable_sort,堆排的heap_sort(附送全套heap操作函数)。
再有,map和set以RB-tree为底层数据结构,你肯定不会怀疑它们的重要性的;priority_queue对于A*也是很有帮助的。
请永远记住这2点:
STL的区间都是左闭右开的,begin和end之间的区间就是:[begin, end)
比较函数一定要遵循严格弱序化原则: 对于相等的两个元素,不能返回true。
更详细的请参考《Effective STL》

~ 每次测试输入用复制粘贴多累阿,试试这两个语句:
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);

~ BT输入
有时候出题的人他心情不爽,不告诉你有多少个数字
——反正就是塞在一行里面,你自己读去吧
这时候可以选择自己模拟scanf的方式输入整数或者字符串
但是这个代码写起来稍微有点痛苦,是吧。
试试ungetc()和strtok()函数吧。



推荐阅读
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
  • ZABBIX 3.0 配置监控NGINX性能【OK】
    1.在agent端查看配置:nginx-V查看编辑时是否加入状态监控模块:--with-http_stub_status_module--with-http_gzip_stat ... [详细]
  • 进入配置文件目录:[rootlinuxidcresin-4.0.]#cdusrlocalresinconf查看都有哪些配置文件:[rootlinuxid ... [详细]
author-avatar
嘿可爱无罪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有