POJ2418 Hardwood Species

  原题传送:http://poj.org/problem?id=2418

  用的是STL神器,map + priority_queue。(C++提交和G++提交相差6s !)

View Code
 1 #include <map>
 2 #include <queue>
 3 #include <string>
 4 #include <iostream>
 5 #include <iterator>
 6 #include <stdio.h>
 7 using namespace std;
 8 
 9 typedef pair<string, double> psi;
10 
11 int main()
12 {
13     string s;
14     map<string, int> m;
15     priority_queue<psi, vector<psi>, greater<psi> > q;
16     int sum = 0;
17     while(getline(cin, s) != NULL)
18     {
19         if(m.find(s) == m.end())
20             m[s] = 1;
21         else
22             m[s] ++;
23         sum ++;
24     }
25     psi tmp;
26     for (map<string, int>::iterator iter = m.begin(); iter != m.end(); ++iter)
27     {
28         tmp.first = iter->first;
29         tmp.second = (iter->second + 0.0) / sum;
30         q.push(tmp);
31     }
32     while(!q.empty())
33     {
34         cout << q.top().first << " ";
35         printf("%.4f\n", q.top().second * 100);
36         q.pop();
37     }
38     return 0;
39 }

 

 

  这题更好的一个做法是用排序二叉树,根据排序二叉树的性质:

 

  若他的左子树不空,则左子树上所有的结点均小于它的根结点的值。

  若他的右子树不空,则右子树上所有的结点均大于它的根结点的值。

  他的左右子树也是排序二叉树。

  

  在构造完成排序二叉树后进行一次中序遍历就可以了。

posted @ 2012-09-15 10:18  芒果布丁  阅读(172)  评论(0编辑  收藏  举报