HDU 1004 题解

HDU 1004

【标记】【字符串】【map】
题目


Main Idea:

    输入数字N,有N个气球,每行输入气球颜色,最后输出相同颜色气球最多的颜色。

Summary:

    1.用while会造成PE
int N=1;
    while(N!=0){
        scanf("%d",&N);
        
    }
    2.熟练运用strcpy、strcmp、strlen等函数

    3.关于颜色个数专门开一个数组或者vector来标记

    4.用map容器可以很快的解决问题。

Problem Solving Idea

    对于每个输入的字符串用一个二维字符串数组存储,并构建一个元素全为0数组,在二维字符串数组对应的行数进行标记(+1)。如果发现输入字符串在二维字符串数组中已存在,则不新存入字符串,在数组对应的地方++。最后检查数组哪个地方数字最大,则得出二维字符串数组中第几行的字符串是出现次数最多的,输出该字符串。

AC代码(version 1)

#include <bits/stdc++.h> 
#define ll long long
using namespace std;

int Findmax(int record[]){
	int Find=0,max=0,i=1;
	for(i=1;i<101;i++){
		if(max<record[i]){
			max=record[i];
			Find=i;
		}
	}
	return Find;
}

int main(){
	int N=1;
	for(;;){
		scanf("%d",&N);
		if(N==0)	break;
		int cnt=0;
		char compare[103][17];
		int record[101];
		memset(record,0,sizeof(record));
		for(int i0=0;i0<N;i0++){
			int flag=1,i;
			char s[17];
			scanf("%s",s);
			for(i=1;i<=cnt;i++){
				if(strcmp(compare[i],s)==0){
					flag=0;
					//printf("%d",flag);
					break;
				}
			}
			if(flag==1){
				strcpy(compare[++cnt],s);
				record[cnt]++;
			}
			if(flag==0)	record[i]++;
			
		}
		printf("%s\n",compare[Findmax(record)]);
	}
	return 0;
}

AC代码(version 2)

#include <bits/stdc++.h> 
using namespace std;
typedef long long ll;
map<string,int> mp;
int main()
{
	int t;
 	while(cin >> t && t != 0)
 	{
 		mp.clear();
 		string p;
 		int maxs = 0;
 		for(int i = 0;i < t;i ++)
 		{
 			string k;
 			cin >> k;
 			mp[k]++;
 			if(mp[k] > maxs)
 			{
 				maxs = mp[k];
 				p = k;
			}
		}
	   cout << p << endl;
	}
	return 0;
}

posted on 2019-11-29 17:34  休比  阅读(124)  评论(0编辑  收藏  举报