[poj 2418]Hardwood Species

题目链接

http://poj.org/problem?id=2418

大意

给出森林中每棵树的树种名称,求出森林中各树种的树占总数的百分比,保留4位小数(输出时树种名按字典序的升序排列)。

题解

其实这本来是一道BST的练习题,但是我们可以用现成的BST啊,干嘛要手写呢!

于是,map闪亮登场。

但C++终究是个玄学的东西,一方面用map要用到十分复杂的迭代器(毕竟poj还不支持C++11),另一方面是在输入输出上。

由于cout输出时很难做到像”%.2lf”这样保留若干位小数输出(cout可以控制保留的有效数字位数),所以不得不将printf和cout混合使用(用cout是因为用到了getline(总不能用gets()吧))。

为了防止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;
}

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注