首页 > 代码库 > HDU 1004(AC代码)

HDU 1004(AC代码)

 1 #include <stdio.h> 2 #include <string.h> 3 char a[1000][16]; 4 int b[1000]={0}; 5 int main() 6 { 7     int n,i,j,k,max,loc; 8     while(scanf("%d",&n)!=EOF&&n!=0){ 9         max=-1;10         k=0;11         loc=0;12         for(i=0;i<n;i++){13             scanf("%s",a[k]);14             for(j=0;j<k;j++){  15                 if(strcmp(a[j],a[k])==0){16                     b[j]++;17                     k--;18                     break;19                 }20             }21             k++;22         }23         for(i=0;i<k;i++){24             if(b[i]>max){25                 max=b[i];26                 loc=i;27             }28             b[i]=0;29         }30         puts(a[loc]);31     }32     return 0;33 }

 

gets遇到回车才结束,并把回车符改为‘\0‘再存到字符串。注:如果输入的数字过长,这个函数会出问题,因为他不判断输入的长度的。

puts只要遇到第一个‘\0‘就会输出,并自动输出一个换行符。

格式:这个格式没很大问题,遇到0就结束,而不用输出换行再结束。

思路:

1、题中明确说答案只会有一个,也就是不会出现比如:2 red green的情况。

2、一个二维的字符数组,保存输入的颜色。

3、一个int型数组记录每个颜色出现的次数。(我把他初始化为0,是因为次数不重要,重要的是谁是最多的,实际上应该是该数字+1)

 

技巧:

1、每输入一个颜色,就对比前面输入的颜色中有没有出现过,若有,在该颜色位置对应的int数组上+1。

2、若输入的已经在之前的颜色中存在,在1中已经记录过出现的次数,那么颜色数组中刚输入的位置就可以重复利用了。

3、若输入的没有在之前的颜色中存在(即新颜色),该位置就不能被覆盖了。

4、输完之后,只需要对比一下int数组中的前k个就行啦(看代码),不用扫整个int数组了,这对于“大部分都是重复出现的颜色”情况就好多了,要是只有两个颜色,一次对比就搞定。

HDU 1004(AC代码)