Kai’blog

技术博客

【散列】贪婪的送礼者

贪婪的送礼者

思路


这道题可以用模拟做,但是会很麻烦而且易出错,这道题最好的办法就是用映射,也就是散列表做。
建立一个把string对象映射为int类型的map,然后用名字做索引,钱数做数据,计算完毕后输出即可。
另外,为保证名字的输出顺序与输入顺序相同,建议用一个string对象的name数组来依序存储名字。

Code

#include<iostream>
#include<map>
#include<string>
using namespace std;
int n,money,p,num;
string s,name[12];
map<string,int> cnt;
int main()
{
 	cin>>n;
 	for(int i=1;i<=n;i++)
 		cin>>name[i];
 	for(int i=1;i<=n;i++)
 	{ 
 		cin>>s>>money>>p;
 		if(p!=0) 
         	num=money/p;//特判
 		else 
         	num=0;
 		cnt[s]-=num*p;
 		for(int j=1;j<=p;j++)
 		{
   			string person;
   			cin>>person;
   			cnt[person]+=num;      
  		}     
 	}
 	for(int i=1;i<=n;i++)
 		cout<<name[i]<<" "<<cnt[name[i]]<<endl;
}
posted @ 2019-07-24 10:48  Kai02  阅读(216)  评论(0编辑  收藏  举报
Copyright © 2019-2020 拱大垲. All rights reserved.