1. 程式人生 > >SDUT數據結構實驗之查找三:樹的種類統計

SDUT數據結構實驗之查找三:樹的種類統計

accep int ont let lac urn *** 保留 隨著

數據結構實驗之查找三:樹的種類統計

Time Limit: 400 ms Memory Limit: 65536 KiB

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%

提示:本題所運用的是字符串的比較,將其中相同的地方全都置到樹的同一邊,再進行判斷

代碼實現如下(g++):
#include <bits/stdc++.h>

using namespace std;

typedef struct node
{
    char data[22];
    int d;
    struct node *left,*right;
} node;

int n; node *create(node *root,char *a)//建樹 { if(!root) { root=new node; root->d=1;//記數 strcpy(root->data,a); root->left=NULL; root->right=NULL; } else { int t=strcmp(root->data,a); if(t>0) { root
->left=create(root->left,a); } else if(t<0) { root->right=create(root->right,a); } else//如果相等,就使root->d加一 { root->d++; } } return root; } void midsort(node *root) { if(root) { midsort(root->left); printf("%s %.2lf%%\n",root->data,root->d*100.0/n);//用root->d/n來表示每種樹的百分比 midsort(root->right); } } int main() { node *root=NULL; char a[22]; scanf("%d",&n); getchar(); for(int j=0;j<n;j++) { gets(a); int len=strlen(a); for(int i=0; i<len; i++) { if(a[i]>=A&&a[i]<=Z)//不區分大小寫,就全置為小寫 { a[i]+=32; } } root=create(root,a); } midsort(root); return 0; } /*************************************************** Result: Accepted Take time: 0ms Take Memory: 240KB ****************************************************/

SDUT數據結構實驗之查找三:樹的種類統計