Re: [问题] zj e295. IO 优化

楼主: firejox (Tangent)   2019-07-11 23:58:12
光用推文表达可能有点不太清楚,所以来回一篇了
※ 引述《nevikw39 (☆牜攵☆犬羊)》之铭言:
: 大家好,
: 暑假废惹那么多天,今天总算来做点有意义的事喇
: 题目网址:https://zerojudge.tw/ShowProblem?problemid=e295
: 我现在的问题是,写了个自订的读整数函式,却没有办法准确知道何时 EOF。
: 在我的 Windows 10 (gcc 6.3), WSL Ubuntu (gcc 7.3) 上遇到 Crtl + Z 或 Crtl + D 都
: 可以正常离开,但在 ZeroJudge 连范例测资测试执行都会 TLE 被 killed。
: 程式码:https://pastebin.com/YzWYFedy
: 请各位大大不吝给予意见指教,谢谢
: 顺便问一下,同样是函式模板,为什么 out 就会自动推导型别,in 却得自己指定呢?
对于小测资会有TLE,通常是卡在有循环的地方。而这边只有两个地方是有循环的,
而且会影响while(!feof(stdin))的是输入,因此要去检查输入函式。
Q1: 在读到档尾,或者遇到输入错误时,他会回传什么?
inline char get()
{
char buf[1];
fread(buf, 1, 1, stdin);
return *buf;
}
A: 不知道,因为buf未初始化。(13诫第1条)
Q2: 这样会导致TLE?
A: 会的,因为get()的回传端看编译器怎么处理未初始化变量。
假设每次呼叫时buf的位址都一样且都不会把区域变量内容清空。
那么在读到EOF时,get()会回传最后一个输入的字符。如果不是数字,
则会跳出do-while,反之则无穷循环。
Q3: ZJ的范测最后一行没换行?
A: 是,请注意光标位置。
分享点个人心得,要判断输入输出是否有恼人的换行,可以善用反白,
你可以看得到独特的小方格。
作者: nevikw39 (牧)   2019-07-12 21:36:00
感谢 f 大,终于过测试执行惹。在 do-while 里判断是否eof,是的话看 n 的值决定 return n; 或 exit

Links booklink

Contact Us: admin [ a t ] ucptt.com