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

系统管理员 2023-08-17 15:41 208阅读 0赞

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把扫帚。
……

  1. 在检查了所有可能的方法后,我们发现2是所需扫帚的最小数量。

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

  1. 4
  2. 10
  3. 20
  4. 30
  5. 04
  6. 5
  7. 2
  8. 3
  9. 4
  10. 3
  11. 4

Sample Output

  1. 1
  2. 2
  3. 思路:这题还可以用其他方法写,由于长度达到30位,所以用字典树写,这题很坑,有前导零,一开始没注意,所以要先去除前导零
  4. 然后再用字典树记录每个字符串出现的次数,这里不是记录前缀了,还有re了几发,上网看其他题解才知道要释放字典树的内存。。
  5. //
  6. // Created by HJYL on 2019/8/20.
  7. //
  8. #include <iostream>
  9. #include <vector>
  10. #include <map>
  11. #include <string>
  12. #include <queue>
  13. #include <stack>
  14. #include <set>
  15. #include <algorithm>
  16. #include <cstdio>
  17. #include <cstring>
  18. #include <cmath>
  19. #include <cstdlib>
  20. using namespace std;
  21. typedef long long ll;
  22. const int maxn=1e6+10;
  23. struct trie{
  24. trie* next[50];
  25. int sum;
  26. }*root;
  27. trie* build()
  28. {
  29. trie *T=(trie *)malloc(sizeof(trie));
  30. T->sum=0;
  31. for(int i=0;i<10;i++)
  32. T->next[i]=NULL;
  33. return T;
  34. }
  35. int maxx;
  36. void insert(char* s)
  37. {
  38. trie* p=root;
  39. for(int i=0;s[i];i++)
  40. {
  41. if(p->next[s[i]-'0']==NULL)
  42. {
  43. p->next[s[i]-'0']=build();
  44. }
  45. p=p->next[s[i]-'0'];
  46. }
  47. p->sum++;
  48. if(p->sum>maxx)
  49. maxx=p->sum;
  50. }
  51. void delete_tri(trie *T)//释放字典树
  52. {
  53. if(T!=NULL)
  54. {
  55. for(int i=0;i<10;i++)
  56. {
  57. if(T->next[i]!=NULL)
  58. delete_tri(T->next[i]);
  59. }
  60. }
  61. free(T);
  62. T=NULL;
  63. }
  64. int main() {
  65. //freopen("C:\\Users\\asus567767\\CLionProjects\\untitled\\text", "r", stdin);
  66. int T;
  67. char str[50];
  68. while (~scanf("%d", &T)) {
  69. root=build();
  70. maxx=0;
  71. for (int i = 0; i < T; i++) {
  72. scanf("%s", str);
  73. int j=0;
  74. while(str[j]=='0')
  75. j++;
  76. insert(str+j);
  77. }
  78. if(maxx==0)
  79. maxx=1;
  80. printf("%d\n", maxx);
  81. delete_tri(root);
  82. }
  83. return 0;
  84. }

转载于:https://www.cnblogs.com/Vampire6/p/11385734.html

发表评论

表情:
评论列表 (有 0 条评论,208人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDU 1298(字典+dfs)

    题意:给一个T,表示输入数据的组数。给一个n,表示字典的大小。接下来有n行,每行有一个字符串和一个数字,数字表示为这个字符串的权值。接下来给一个m,表示手机按键的串号,结尾1表

    相关 HDU1247(字典)

    题意:给定一排字符串组成一个字典,求在字典中自否存在由字典中另外两个字符串组成的字符串。   include <iostream> include <st