[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 是因为用到了 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;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据