蓝桥杯 ALGO-951 预备爷的悲剧

  这题题目其实比较简单,大概意思就是给一些单词和页数给你,要你统计这些单词和它们的最小页数,典型的“key-value”结构,很容易可以想到用

map<string,int>

  但问题在于这个map容器对string的对比不是很友好(目前尚不知道什么原理,希望评论区的大佬能指点指点),对于相同的string仍会插入。所以只能借助结构或类,自己重载运算符的方式进行比较了,这里我选择用结构。

struct English{
	string str;
	bool operator<(const English str1)const
	{
		return this->str<str1.str;
	}
};

这样我们就可以用map容器很方便的将所有给出单词及它们的最小页数统计起来,然后再根据要复习的单词将页数统计起来,由于页数有重复这里选择用一个set容器来统计(set容器里不会有重复数据),最后直接统计set容器的长度就是我们要得到的复习的页数。这道题到这里基本就完成了(最麻烦的其实还是处理输入(-_-))。上代码

#include<iostream>
#include<cstring>
#include<map>
#include<set>
using namespace std;

struct English{
	string str;
	bool operator<(const English& str1)const
	{
		return this->str<str1.str;
	}
};

int main()
{
	set<int> pages;
	map<English,int> word;
	int n;                       //给出单词数量 
	cin>>n;
	for (int i=0;i<n;i++)
	{
		getchar();
		English W;
		getline(cin,W.str,' ');
		int n;
		cin>>n;
		if(word.count(W)&&n<word[W])
		    word[W]=n;
		else
		    word.insert(pair<English,int>(W,n));
	}
	int m;                       //要背单词数量 
	cin>>m;
	getchar();
	for (int i=0;i<m;i++)
	{
		English W;
		getline(cin,W.str,'\n');
		if(word.count(W)==1)
			pages.insert(word[W]);
	}
	cout<<pages.size();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值