C题就是两个集合相加,然后去除掉重复的元素。
本题可以利用STL中的set来解决,将两个集合中的元素分别插入到set定义的新集合中,自动去重。
程序结束时不要忘记清空,同时下面程序段里有一个最后一个数的末尾没有空格的技巧。
for( int i=0; i<numa; i++ )
{
scanf("%d", &number );
s.insert(number);
}
for( int i=0; i<numb; i++ )
{
scanf("%d", &number );
s.insert(number);
}
set<int> :: iterator it;
set<int> :: iterator it2;
it2 = s.end();
it2--;
for(it = s.begin(); it != it2; it++ )
{
cout<<*it<<" ";
}
cout<<*it2<<endl;
s.clear();
D题是用一个嵌套的map,使地名指向水果名,水果名指向数量。可以 map<string, map<string, int> > ma; 这样来定义。也可以利用结构体使嵌套的map定义成两个普通的map,但本质上仍然是一个嵌套的map。
struct node{
map<string, int> name_num;
};
int main()
{
map<string, node> ma;
string name, place;
int num;
int n, t;
scanf("%d", &t );
while( t-- )
{
ma.clear();
scanf("%d", &n );
for( int i=0; i<n; i++ )
{
cin>>name>>place>>num;
ma[place].name_num[name] += num;
}
map<string, node> :: iterator it;
map<string, int> :: iterator temp;
for( it = ma.begin(); it != ma.end(); it++ )
{
cout<<it->first<<endl;
for( temp = it->second.name_num.begin(); temp != it->second.name_num.end(); temp++ )
cout<<" |----"<<temp->first<<"("<<temp->second<<")"<<endl;
}
if( t != 0 )
printf("\n");
}
注意的是上面程序段中 ma[place] 是通过键来访问值,如果键不存在则添加这个键并将值初始化为0;ma[place]就是键place对应的值,而这个值是一个node型的结构体。每次执行完程序都要清空。
E题就是一个简单的map的使用,原理是利用map键的单一性以及值的可修改性。每次输出都可以通过判断输入的颜色是否已经存在,如果存在就将值加一,如果不存在就添加键并将值设为1。
while( scanf("%d", &n ), n )
{
for( int i=0; i<n; i++ )
{
cin>>s;
if( le.count(s) )
le[s]++;
else
le[s];
}
int maxn = 0;
map<string, int> :: iterator it;
for( it = le.begin(); it != le.end(); it++ )
{
if( maxn < it->second )
maxn = it->second;
}
for( it = le.begin(); it != le.end(); it++ )
{
if( maxn == it->second )
{
cout<<it->first<<endl;
break;
}
}