Student List for Course¶
题目链接:1047 Student List for Course (25 point(s))
题干大意¶
跟A1039
反过来了,给你学生信息,输出每个课程选的学生信息。
思路¶
刚开始,直接将学生名字存入course
向量,但最后一个总超时,后来是用unordered_map
存储学生下标与名字的映射,以为是emplace_back
string
的时候耗时,但最后一个还是超时,最后经过搜寻,才知道是cout
导致的问题,所以这个题用不着unordered_map
。
另外不得不吐槽一下,题目中本来就说末尾没有额外的空行,下面代码也没有对最后一行输出有判断就能AC
,就很无语,,,
cout
超时问题分析¶
上述思路中,已经表述,初步写的代码中,过不了第三个测试点,一直超时,下面是我的处理分析过程:
经过搜寻资料,得知:cout
比printf
多个缓冲区,只有当缓冲区写满的时候才会真正输出,而当使用std::endl
输出换行时,末尾会再运行一个flush
强行清除缓冲区,这样就没能发挥cout
中缓冲区的优化,所以显得运行时间要长。但当使用"\n"
输出换行时,就跟printf
差不多了(就本题而言)。
另外,printf
与cout
不要混用,因为在多线程环境下,他们的执行顺序不一定会是执行完一个再执行另一个,而一个不使用缓冲区的突然跳到使用缓冲区的输出方式,或者反过来,会造成非期望的结果。
所以,最终结论是,这道题,cout
使用\n
输出换行一样也能过!!!