编号统计

时间限制:2000 ms  |  内存限制:65535 KB
难度:2
 
描述
zyc最近比较无聊,于是他想去做一次无聊的统计一下。他把全校同学的地址都统计了一下(zyc都将地址转化成了编码),然后他希望知道那个地方的同学最多(如果同学最多的地方有多个,输出编号最小的一个)。
 
输入
第一行输入一个正整数T(0<T<=11)表示有T组测试数据
每组测试数据第一行输入一个正整数N(0<N<200000)表示有N个编号,随后输入N个编码(编码由数字组成且少于十位)
输出
每组数据输出占一行输出出现次数最多的编号
样例输入
1
5
12345 456 45 78 78
样例输出
78
  1 //2011-11-27 :代码一:超时代码
  2 /*
  3 #include<stdio.h>
  4 #include<malloc.h>
  5 typedef struct 
  6 {
  7     int site;//地址编号
  8     int num;//该地址下人数
  9 }stu;
 10 int main()
 11 {
 12     int t,i,j,n;
 13     stu *a,max;
 14     scanf("%d",&t);
 15     while(t--)
 16     {
 17         scanf("%d",&n);
 18         a=(stu*)malloc(n*sizeof(stu));
 19         for(i=0;i<n;++i)
 20         {
 21             a[i].num=1;
 22             scanf("%d",&a[i].site);
 23             for(j=0;j<i;++j)
 24             {
 25                 if(a[j].site==a[i].site)
 26                 {
 27                     ++a[j].num;
 28                     --i;
 29                     --n;
 30                     break;
 31                 }
 32             }
 33         }
 34         for(i=0;i<n;++i)
 35         {
 36             if(!i)
 37             {
 38                 max=a[0];
 39                 continue;
 40             }
 41             if(max.num<a[i].num)
 42                 max=a[i];
 43             else if(max.num==a[i].num)
 44                 max=max.site<a[i].site?max:a[i];
 45         }
 46         printf("%d\n",max.site);
 47         free(a);
 48     }
 49     return 0;
 50 }
 51 */
 52 
 53 /*
 54  //代码二:-----字典树(超时依旧)
 55 #include<cstdio>
 56 #include<cstring>
 57 
 58 struct tree
 59 {
 60     int sum;
 61     struct tree *next[10];
 62 };
 63 int max;
 64 char num[15];
 65 
 66 void insert(char *s,tree *T)
 67 {
 68     tree *p,*q;
 69     int i,j,id;
 70     p=T;
 71     i=0;
 72     while(s[i])
 73     {
 74         id=s[i]-'0';
 75         if(p->next[id]==NULL)
 76         {
 77             q=new tree;
 78             q->sum=0;
 79             for(j=0;j<10;++j)
 80                 q->next[j]=NULL;
 81             p->next[id]=q;
 82         }
 83         p=p->next[id];
 84         ++i;
 85     }
 86     p->sum++;
 87     if(p->sum>max)
 88     {
 89         max=p->sum;
 90         strcpy(num,s);
 91     }
 92 }
 93 
 94 int main()
 95 {
 96     int m,i,n;
 97     char s[15];
 98     tree *T;
 99     scanf("%d",&m);
100     while(m--)
101     {
102         T=new tree;
103         T->sum=0;
104         for(i=0;i<10;++i)
105             T->next[i]=NULL;
106         scanf("%d",&n);
107         max=0;
108         while(n--)
109         {
110             scanf("%s",s);
111             insert(s,T);
112         }
113         printf("%s\n",num);
114     }
115     return 0;
116 }
117 
118 */
119 
120 //代码三:----人就容易手定向思维的影响---本题排序后直接求最长平台即可
121 #include<cstdio>
122 #include<algorithm>
123 using namespace std;
124 
125 int main()
126 {
127     int T,n,i,k,max,count;
128     int *num;
129     scanf("%d",&T);
130     while(T--)
131     {
132         scanf("%d",&n);
133         num=new int[n];
134         for(i=0;i<n;++i)
135             scanf("%d",&num[i]);
136         sort(num,num+n);
137         max=0;
138         count=1;
139         for(i=1;i<n;++i)
140         {
141             while(num[i]==num[i-1])
142             {
143                 ++count;
144                 ++i;
145             }
146             if(max<count)
147             {
148                 max=count;
149                 k=num[i-1];
150             }
151             count=1;
152         }
153         printf("%d\n",k);
154     }
155     return 0;
156 }

 

posted on 2012-08-23 17:59  可笑痴狂  阅读(299)  评论(0编辑  收藏  举报