HDU1800 Flying to the Mars【字典树】

本文介绍了一个经典的算法问题——扫帚问题,并提供了详细的解题思路和AC代码。通过构建字典树来统计数字的出现频率,从而确定最少需要的扫帚数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1800


题目大意:

有N个士兵。用不同的整数表示不同的级别。级别高的士兵可以教级别低的士兵,他们可以共用一把

扫帚。一个士兵最多只能有一个学生或一个老师。问:最少需要几把扫帚。


思路:

对于士兵都不相同的士兵,只需要一把扫帚。那么问题转变为找出给出数理重复次数最多的个数。建

立字典树,将每个数当作字符串插入字典树中,记录每个数出现的次数,最后找出重复出现次数的最

大值即为所求。注意:04和4都表示4,插入的时候,应该清除掉前导零。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;

struct TrieNode
{
    int Count;
    struct TrieNode *Next[10];
};

TrieNode *root;
int Max;

void Create()
{
    root = new TrieNode;
    memset(root->Next,NULL,sizeof(root->Next));
    root->Count = 0;
}

void Insert(char *s)
{
    TrieNode *p, *q;
    p = root;
    while(*s)
    {
        if(!p->Next[*s-'0'])
        {
            q = new TrieNode;
            memset(q->Next,NULL,sizeof(q->Next));
            q->Count = 0;
            p->Next[*s-'0'] = q;
        }

        p = p->Next[*s-'0'];
        s++;
    }
    p->Count++; //只记录每个数的个数,不记录前缀出现次数
    if(p->Count > Max)
        Max = p->Count;
}

char str[33];
int main()
{
    int N;
    while(~scanf("%d",&N))
    {
        Max = 0;
        Create();
        for(int i = 0; i < N; ++i)
        {
            scanf("%s",str);
            int j = 0;
            while(str[j] == '0')
                j++;
            Insert(str+j);
        }
        printf("%d\n",Max);
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值