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
",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;
}