博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flying to the Mars HDU - 1800(字典树)
阅读量:4557 次
发布时间:2019-06-08

本文共 2191 字,大约阅读时间需要 7 分钟。

Flying to the Mars 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位);
产量
    对于每种情况,在一条线上输出最小数量的扫帚。
样本输入

410203004523434
Sample Output
12 思路:这题还可以用其他方法写,由于长度达到30位,所以用字典树写,这题很坑,有前导零,一开始没注意,所以要先去除前导零 然后再用字典树记录每个字符串出现的次数,这里不是记录前缀了,还有re了几发,上网看其他题解才知道要释放字典树的内存。。
// // Created by HJYL on 2019/8/20.//#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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

你可能感兴趣的文章
高效的MySQL分页
查看>>
MooTools 1.2 Beginner's Guide
查看>>
计算储存、交互和语言
查看>>
bzoj2067: [Poi2004]SZN
查看>>
所谓独立环境
查看>>
当代GSM手机的硬件系统分析[zz]
查看>>
对我影响最深的三个老师
查看>>
开源项目托管GitHub
查看>>
Unity学习笔记—— 常用脚本函数
查看>>
.getCellType()的几种类型值
查看>>
linux中启动 java -jar 后台运行程序
查看>>
运行web项目端口占用问题
查看>>
Java Spring-IOC和DI
查看>>
【NOIP1999】【Luogu1015】回文数(高精度,模拟)
查看>>
Linux上安装Python3.5
查看>>
crt安装
查看>>
git切换分支报错:error: pathspec 'origin/XXX' did not match any file(s) known to git
查看>>
c++中static的用法详解
查看>>
转 我修改的注册表,但是程序运行起来,还是记着以前的
查看>>
图片轮播功能
查看>>