L2-021 点赞狂魔 (25 分)

这道题直接用map就行,我用了三个map,mp是用来判断对于一个人str来说,这个标签是否已经出现过的,cnt记录str的点击过的标签种类数,cishu就是str的一共的点赞次数,最后将他们放入结构体数组中,,按照题意排序再输出就OK了,这道题难度还是相当低的。

#include<iostream>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
map<string,set<int> >mp;
map<string,int>cnt; 
map<string,int>cishu;
struct node{
	string str;
	int cnt;
	double ave;
}ret[105];
bool cmp(node a,node b)
{
	if(a.cnt>b.cnt)return true;
	if(a.cnt==b.cnt&&a.ave<b.ave)return true;
	return false;
}
int main()
{
	int n;
	cin>>n;
	char str[1000];
	for(int i=0;i<n;i++)
	{
		string str;
		cin>>str;
		cnt[str]=0;			//标签种类数 
		cishu[str]=0;		//一共点赞次数 
		int k,t;
		cin>>k;
		while(k--)
		{
			scanf("%d",&t);
			cishu[str]++;
			int siz=mp[str].size();
			mp[str].insert(t);
			if(siz!=mp[str].size())
			cnt[str]++;
		}
	}
	map<string,int>::iterator it;
	int k=0;
	for(it=cnt.begin();it!=cnt.end();it++)
	{
		ret[k].str=(*it).first;
		ret[k].cnt=(*it).second;
		ret[k].ave=cishu[ret[k].str]*1.0/ret[k].cnt;
		k++;
	}
	sort(ret,ret+n,cmp);
//	for(int i=0;i<n;i++)
//	{
//		cout<<ret[i].str<<' '<<ret[i].cnt<<' '<<ret[i].ave<<endl;
//	}
	for(int i=0;i<(n<=3?n:3);i++)
	{
		cout<<ret[i].str;
		if(i!=(n<=3?n:3)-1)
		cout<<' ';
	}
	while(3-n>0)
	{
		n++;
		cout<<" -";
	}
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值