Flying to the Mars HDU - 1800(字典树)

Flying to the Mars HDU - 1800

题目链接:https://vjudge.net/problem/HDU-1800

题目:在8888年,地球由PPF帝国统治。随着人口的增长,PPF需要为新生儿寻找更多的土地。最后,PPF决定攻击统治火星的Kscinow。问题来了!士兵怎么能到达火星? PPF召集他的士兵并询问他们的建议。 “匆匆......”一名士兵回答。 “闭嘴 !我是否必须提醒你,从这里到火星没有任何道路!“PPF回复道。 “飞!”另一个答案。 PPF笑道:“聪明的家伙!虽然我们没有翅膀,但我可以从HARRY POTTER购买一些魔法扫帚来帮助你。“现在,是时候学会用扫帚飞行了!我们假设一名士兵有一个级别数字表示他的学位。具有较高等级的士兵可以教低级,也就是说前者的等级>后者。但是较低的不能教更高。一名士兵最多只能有一名教师,当然,没有老师也是合法的。同样,一名士兵最多只能有一名学生,而没有学生也是可能的。老师可以用同样的扫帚教他的学生。当然,所有的士兵都必须在扫帚上练习才能飞到火星上!魔法扫帚是昂贵的!所以,你能帮助PPF计算所需的最小扫帚数量。
    例如 :
    有5名士兵(A B C D E),等级编号:2 4 5 6 4;
    一种方法:
    C可以教B; B可以教A;因此,A B C有资格在同一个扫帚上学习。
    D可以教E;所以D E有资格在同一把扫帚上学习;
    使用这种方法,我们需要2把扫帚。
    另一种方法:
    D可以教A;所以A D有资格在同一把扫帚上学习。
    C可以教B;所以B C有资格在同一个扫帚上学习。
    没有老师或学生的E有资格在一把扫帚上学习。
    使用这种方法,我们需要3把扫帚。
    ......

在检查了所有可能的方法后,我们发现2是所需扫帚的最小数量。
输入
    输入文件包含多个测试用例。
    在测试用例中,第一行包含一个正数N,表示士兵数量。(0 <= N <= 3000)
    接下来N行:每行只有一个非负整数,表示每个士兵的等级数。(少于30位);
产量
    对于每种情况,在一条线上输出最小数量的扫帚。
样本输入

4
10
20
30
04
5
2
3
4
3
4

Sample Output

1
2思路:这题还可以用其他方法写,由于长度达到30位,所以用字典树写,这题很坑,有前导零,一开始没注意,所以要先去除前导零然后再用字典树记录每个字符串出现的次数,这里不是记录前缀了,还有re了几发,上网看其他题解才知道要释放字典树的内存。。

//
// Created by HJYL on 2019/8/20.
//
#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long ll;
const int maxn=1e6+10;
struct trie{
    trie* next[50];
    int sum;
}*root;
trie* build()
{
    trie *T=(trie *)malloc(sizeof(trie));
    T->sum=0;
    for(int i=0;i<10;i++)
        T->next[i]=NULL;
    return T;
}
int maxx;
void insert(char* s)
{
    trie* p=root;
    for(int i=0;s[i];i++)
    {
        if(p->next[s[i]-‘0‘]==NULL)
        {
            p->next[s[i]-‘0‘]=build();
        }
        p=p->next[s[i]-‘0‘];
    }
    p->sum++;
    if(p->sum>maxx)
        maxx=p->sum;
}
void  delete_tri(trie *T)//释放字典树
{
    if(T!=NULL)
    {
        for(int i=0;i<10;i++)
        {
            if(T->next[i]!=NULL)
                delete_tri(T->next[i]);
        }

    }
    free(T);
    T=NULL;
}
int main() {
    //freopen("C:\\Users\\asus567767\\CLionProjects\\untitled\\text", "r", stdin);
    int T;
    char str[50];
    while (~scanf("%d", &T)) {
        root=build();
        maxx=0;
            for (int i = 0; i < T; i++) {
                scanf("%s", str);
                int j=0;
                while(str[j]==‘0‘)
                    j++;
                insert(str+j);
            }
            if(maxx==0)
                maxx=1;
        printf("%d\n", maxx);
        delete_tri(root);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/Vampire6/p/11385734.html

时间: 2024-12-26 05:07:04

Flying to the Mars HDU - 1800(字典树)的相关文章

HDU 1800 字典树

Flying to the Mars Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10065    Accepted Submission(s): 3270 Problem Description In the year 8888, the Earth is ruled by the PPF Empire . As the popul

hdu 1075 字典树

// hdu 1075 字典树 // // 题目大意: // // 给你一个字典,即有两个字符串,一个是英文,一个是火星文,然后 // 输入一段火星文,要你翻译成英文. // // 解题思路: // // 字典树,查字典嘛,有就输出查到的,没有原样输出.将火星文插入到 // 字典树中,然后在字典输中查找.找到了,输出对应的英文,否则,原样输 // 出. // // 感悟: // // 题目确实很简单,但是,没告诉数据范围啊,导致我一直RE,原来单词 // 可能对应很长的英文啊,找人家ac的开数组

HDU 1251 字典树入门

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 17177    Accepted Submission(s): 7410 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前

HDU 5384 字典树、AC自动机

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 1 #include<stdio.h> 2 #include<string.h> 3 #include<string> 4 #include<iostream> 5 using namespace std; 6 struct node{ 7 int cnt; 8 node *next[26]; 9 node(){ 10 c

hdu 1075(字典树)

What Are You Talking About Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/204800 K (Java/Others)Total Submission(s): 21658    Accepted Submission(s): 7228 Problem Description Ignatius is so lucky that he met a Martian yesterday. But

HDU 5687 字典树插入查找删除

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 1 #include<stdio.h> 2 #include<string.h> 3 struct node{ 4 int next[27]; 5 int cnt; 6 void init(){ 7 cnt = 0;//计数 8 memset(next,-1,sizeof(next)); 9 } 10 };

hdu 5269 字典树

题目链接:hdu 5269 ZYB loves Xor I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 184    Accepted Submission(s): 101 Problem Description Memphis loves xor very musch.Now he gets an array A.The lengt

hdu 2112(字典树+最短路)

HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 23388    Accepted Submission(s): 5614 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,

Chip Factory HDU - 5536 字典树(删除节点|增加节点)

题意: t组样例,对于每一组样例第一行输入一个n,下面在输入n个数 你需要从这n个数里面找出来三个数(设为x,y,z),找出来(x+y)^z(同样也可以(y+z)^1)的最大值 (“^”代表异或操作,即“相同为0,不同为1”) 题解: 这一道题和Xor Sum HDU - 4825很相似 因为异或运算的特性,我们最后要求最大值,那我们就对这n个数的二进制形式建一颗字典树.然后就暴力枚举是哪两个数相加,然后在字典树中把这两个数删掉.然后在处理完的字典树中查找那个能使结果尽可能大的第三个数(至于怎么