点击跳转到目标网址,密码HPUACM2018

 

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