目录
显示
题目链接
http://poj.org/problem?id=2418
大意
给出森林中每棵树的树种名称,求出森林中各树种的树占总数的百分比,保留 \(4\) 位小数(输出时树种名按字典序的升序排列)。
题解
其实这本来是一道 BST 的练习题,但是我们可以用现成的 BST 啊,干嘛要手写呢!
于是,map 闪亮登场。
但 C++ 终究是个玄学的东西,一方面用 map 要用到十分复杂的迭代器(毕竟 poj 还不支持 C++11),另一方面是在输入输出上。
由于 cout 输出时很难做到像 "%.2lf"
这样保留若干位小数输出(cout可以控制保留的有效数字位数),所以不得不将 printf 和 cout 混合使用(用 cout 是因为用到了 string)。
为了防止 TLE ,顺手加上了ios::sync_with_stdio(false);
。
然后,输出结果就很奇怪了。
上网查了一下,发现在 scanf/printf 和 cin/cout 同时使用时,不能将同步关闭,因此两种IO方式还是不要混合使用的好。
#include <iostream> #include <iomanip> #include <map> #include <string> #include <iterator> #include <algorithm> #include <cstdio> using namespace std; map<string,int> tree; string s; int tot; int main() { //ios::sync_with_stdio(false); //请不要在关闭同步后同时使用cin/cout和scanf/printf,会出现不可预料的后果 while(getline(cin,s)) { tree[s]++; tot++; } for(map<string,int>::iterator it=tree.begin();it!=tree.end();it++)//复杂的遍历方式 { cout<<it->first<<' '; printf("%.4lf\n",it->second*100.0/tot); } return 0; }