• poj 2418 Hardwood Species


    题目意思:给你若干棵树,问你每种树出现的概率;

    解题思路:(1)trie树 ,不过这题的输出很让人纠结,它是按ACSII表的顺序输出的,本以为大小写字母再加上一个空格,开53个数组就够了,但是不幸的WA了, 后来看了别人的解题报告,直接开到了95,改了一下就过了~

    (2)stl的map容器。不过这个很慢,可以过,但是没法很trie树的比,一个700+ms,一个3000+ms。呃,第一次用map,权当练练手。

    trie树:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <math.h>
    #include <queue>
    #define  maxx  95
    using namespace std ;
    
    struct node
    {
        int num ;
        struct node *next[maxx] ;
    }*s ;
    int sum ;
    char str[35] ;
    
    struct node *creat ( )
    {
        struct node *p ;
        p = ( struct node *) malloc ( sizeof ( struct node ));
        for ( int i = 0 ; i < maxx ; i++ )
        p->next[i] = NULL ;
        p->num = 0 ;
        return p ;
    }
    
    void insert ( char str[] )//建树
    {
        int i , x ;
        struct node *p , *q ;
        p = s ;
        for ( i = 0 ; str[i] != '\0' ; i++ )
        {
            x = str[i] - ' ' ;
            if ( p->next[x] == NULL )
            {
                q = creat( ) ;
                p->next[x] = q ;
                p = q;
            }
            else
            p = p->next[x] ;
        }
        p->num++;
    }
    
    void find ( struct node *p , int step )//查找
    {
        for ( int i = 0 ; i < maxx ; i++ )
        {
            if ( p->next[i] != NULL && p->num == 0)
            {
                str[step] = i + ' ' ;//将查找到的字符存起来
                find ( p->next[i] , step + 1 );
            }
            else if ( p->num != 0 )//如果p->num 不为0的话输出
            {
                str[step] = '\0' ;
                printf ( "%s %.4lf\n" , str , ( double )p->num / sum * 100 );
                return ;
            }
        }
    }
    
    int main()
    {
        s = creat( );
        for ( sum = 0 ; gets( str ) ; sum++ )
        {
            insert ( str );
        }
        find ( s , 0 );
        return 0 ;
    }

    map容器的:

    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <map>
    #include <string>
    using namespace std ;
    
    int main()
    {
        string str ;
        map<string , double>mm;
        map<string , double>::iterator s ;
        int sum = 0 ;
        while ( getline ( cin , str ))
        {
            mm[str]++;
            sum++ ;
        }
        for ( s = mm.begin() ; s != mm.end() ; s++ )
        {
            cout<<s->first;
            printf ( " %.4lf\n" , s->second * 100 / sum );
        }
        return 0 ;
    }
  • 相关阅读:
    C++后台开发校招面试常见问题
    算术表达式的前缀,中缀,后缀相互转换
    Redis键值对数据库的设计与实现
    C++经典面试题(最全,面中率最高)
    C++开发工程师面试题大合集
    C++中常用的设计模式
    C++中const修饰函数,函数参数,函数返回值的作用
    C++main函数的参数介绍以及如何在main函数前执行一段代码
    Windows系统下安装tensorflow+keras深度学习环境
    第十三周学习总结
  • 原文地址:https://www.cnblogs.com/misty1/p/2528855.html
Copyright © 2020-2023  润新知