题目链接:
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; }
时间: 2024-11-13 08:08:47