- 题目
在放气球比赛中,有很多不同颜色的气球,现在要统计哪种颜色的气球最多。 - 输入描述
输入数据包含多组测设案例。每组测设案例由 N(0≤N≤1000) 打头, N 表示分发的气球的总数目。接下去的N 行每行包含一种颜色。气球的颜色是一个多达15个小写字母的单词。
一个测设案例的 N=0 表示输入结束。 - 输出描述
对于每个测设案例,把数目最多的那种颜色打印在单独一行上。每个测设案例都仅有一种颜色是最多的。 - 输入样例
5
green
red
blue
red
red
3
pink
orange
pink
0 - 输出案例
red
pink
解答:本题实际上就是统计每种颜色出现的数量,不好的算法可能使编程实现起来比较困难且可能超时。
使用映照容器比较好实现,速度也快。键值是气球颜色的单词,映照数据则是该种颜色气球出现的次数,即Map<Color, Number>。
先把数据统计到Map<Color,Number>中,在搜索出Map中<..,Number>最大的元素,最后把颜色<Color,..>打印出来。代码如下:
//ball.cpp
#include <fstream>
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
//ifstream cin("aaa.txt");
map<string, int> m;
int n, i;
string s;
map<string, int>::iterator it, it2;
while (cin>>n)
{
if (n == 0) break;
m.clear();
for (i = 0; i < n;i++)
{
cin >> s;
//在映照容器中查找键值
if (m.find(s) != m.end())
m[s] = m[s] + 1;
else
m[s] = 1;
}
it2 = m.begin();
for (it = m.begin(); it != m.end();it++)
{
//注意,映照容器中,元素的键值为it->first
//元素映照值为it->second
if (it2->second < it->second)
it2 = it;
}
cout << it2->first << endl;
}
return 0;
}
效果如下: