首页 > 代码库 > 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代码)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。