题目描述
数据结构实验之查找三:树的种类统计
Time Limit: 400 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
随着卫星成像技术的应用,自然资源研究机构可以识别每一个棵树的种类。请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比。
Input
输入一组测试数据。数据的第1行给出一个正整数N (n <= 100000),N表示树的数量;随后N行,每行给出卫星观测到的一棵树的种类名称,树的名称是一个不超过20个字符的字符串,字符串由英文字母和空格组成,不区分大小写。
Output
按字典序输出各种树的种类名称和它占的百分比,中间以空格间隔,小数点后保留两位小数。
Sample Input
2
This is an Appletree
this is an appletree
Sample Output
this is an appletree 100.00%
分析 & 代码
对于这种类似的统计数量并且排序的题目,可以考虑使用二叉排序树解答,例如在这个题中,每次输入数名,就是向数中插入的过程,如果查找到相同的名称则对应的节点记录加一,否则就新建节点储存,这样最后进行中序遍历的结果就是最后的排序结果了。
还找到了一个测试数据,可以参考一下,不过题目要求的精准度不太一样:题目数据
#include<stdio.h>
#include<stdlib.h>
#include<iomanip>
#include<iostream>
using namespace std;
int n;
string temp;
string t[100005];
struct node{
string name;
int num;
struct node * left;
struct node * right;
};
typedef node *tree;
int ins(tree &t, string tempname){
if(t==NULL){
t=new node;
t->name = tempname;
t->num = 1;
t->left = NULL;
t->right = NULL;
}
else{
if(t->name == tempname)
t->num++;
else if(t->name > tempname){
ins(t->left, tempname);
}
else{
ins(t->right, tempname);
}
}
}
int inorder(tree t){
if(t){
inorder(t->left);
cout<<t->name<<" "<<fixed<<setprecision(2)<<t->num/(n*1.0)*100<<"%"<<endl; //指定位数小数的输出方式 头文件为 iomanip
inorder(t->right);
}
}
int main(){
cin>>n;
tree t=NULL;
getchar();
for(int i=0; i<n; i++){
getline(cin, temp);
for(int i=0; i<temp.length(); i++){
if(temp[i]>='A' && temp[i]<='Z')
temp[i] = temp[i] + ('a' - 'A'); //将每个字符串先处理为统一的的小写
}
ins(t, temp);
}
inorder(t);
return 0;
}
以上~