标签:main scanf name 关闭 std ref close first problem
http://poj.org/problem?id=2418
给出森林中每棵树的树种名称,求出森林中各树种的树占总数的百分比,保留4位小数(输出时树种名按字典序的升序排列)。
其实这本来是一道BST的练习题,但是我们可以用现成的BST啊,干嘛要手写呢!
于是,map闪亮登场。
但C++终究是个玄学的东西,一方面用map要用到十分复杂的迭代器(毕竟poj还不支持C++11),另一方面是在输入输出上。
由于cout输出时很难做到像"%.2lf"这样保留若干位小数输出(cout可以控制保留的有效数字位数),所以不得不将printf和cout混合使用。
为了防止TLE,顺手加上了ios::sync_with_stdio(false);
然后,就出现了一些奇怪的事情。
上网查了一下,发现在scanf/printf和cin/cout同时使用时,不能将同步关闭,所以吓得赶快把那行注释掉了。
幸好,最后还是没有TLE。
1 #include <iostream> 2 #include <iomanip> 3 #include <map> 4 #include <string> 5 #include <iterator> 6 #include <algorithm> 7 #include <cstdio> 8 using namespace std; 9 map<string,int> tree; 10 string s; 11 int tot; 12 int main() 13 { 14 //ios::sync_with_stdio(false); 15 //请不要在关闭同步后同时使用cin/cout和scanf/printf,会出现不可预料的后果 16 while(getline(cin,s)) 17 { 18 tree[s]++; 19 tot++; 20 } 21 for(map<string,int>::iterator it=tree.begin();it!=tree.end();it++)//复杂的遍历方式 22 { 23 cout<<it->first<<‘ ‘; 24 printf("%.4lf\n",it->second*100.0/tot); 25 } 26 return 0; 27 }
标签:main scanf name 关闭 std ref close first problem
原文地址:https://www.cnblogs.com/StudyingFather/p/9055417.html