P1125 [NOIP2008 提高组] 笨小猴

一、 前言

二、解法一

 三、解法二_map容器学习笔记

1.map简单介绍

2.使用map

3.map的方法


一、 前言

        洛谷的刷题笔记,第一次写这道题的解法,第二次是为了学习map这个容器改写的一个解法,简单记录一下自己的思路,以及自己学习map容器的笔记。其实这两个方法的思路都一样,可能map容器的看起来更难,但是就当作是自己学习这个容器做的一道题吧。

题目:P1125 [NOIP2008 提高组] 笨小猴 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

二、解法一

        可以完美通过测试点的解法。也不能说是解法一吧,反正就是第一次写的代码,简单说一下自己的思路。

        简单来说就是把每一个字母当作数组的下标,相同字母(下标),就会让对应的值+1,就能够实现记录每一个字母出现的次数,其实map 方法也是一样的。最后的遍历,对字母的遍历这个我还是在另一道题的解答中学到的,因为自己平常做题的时候从来没有想过把字母对应的ASC码值去遍历,这个方法就很聪明哈哈哈哈哈。

        这里需要注意的是,因为我们将每一个字母都进行了遍历,所以在对其出现个数找最小值时,一定要记住出现0次不是最小值。

        然后判断质数的代码就很常见了这里就不多说。

//笨小猴
#include<iostream>
#include<cmath>
using namespace std;
bool isPrime(int n)
{
	if(n<2) return false;
	for(int i=2;i<sqrt(n);i++)
	{
		if(n%i==0) return false;
	}
	return true;
}
int main()
{
	string s;
	int maxn=0,minn=100,count[150]={0},t;
	cin>>s;
	for(int i=0;i<s.length();i++)
	{
		count[s[i]]++;
	}
	for(int i='a';i<='z';i++)
	{
		if(count[i]>maxn) maxn=count[i];
		if(count[i]<minn&&count[i]!=0) minn=count[i]; 
	}
	t=maxn-minn;
	if(isPrime(t)) cout<<"Lucky Word"<<endl<<t;
	else cout<<"No Answer"<<endl<<0;
	return 0;
 } 

 

 三、解法二_map容器学习笔记

        其实思路一点都不难,跟解法一甚至感觉都一样,所以就不多说,主要就是学习map容器。

        现在就是记录一下我自己的学习笔记。啥理论的我就不写了。因为现在也是浅浅的学习哈哈哈

1.map简单介绍

        map主要用于键值对的映射关系,所以map中一定会有键(key)以及其一一对应的值(value)。

        map很有意思,它会自动对所有数据依据键(key)进行排序,所有map内部的数据都是有序的。

        同时map还有去重的功能,也是依据键(key)来的。说一句,map的所有方法都只对键(key)起作用,对值(value)不起作用。

2.使用map

头文件:#include <map>

同时要加上using namespace std;

例如:map<int,int> mp;

这样就算完成了一个map的定义,<>括号内的数据类型可以变化,float,double,char,string都可以

3.map的方法

        这里说一句,关于map的迭代器,我的解法中体现了其中的一种。这样就可以遍历每一组键值对。

        还有其他的就没深入学习了。

for (auto iter = mp.begin(); iter != mp.end(); ++iter) {
		cout << iter->first << " " << iter->second << endl;//此处用的是迭代器来查找的key和value;}


 begin()         返回指向map头部的迭代器

 clear()        删除所有元素

 count()         返回指定元素出现的次数, 但是我觉得准确来说是指定元素(键)是否会出现,出现就返回1,不出现返回0,因为一开始我对这个函数理解错了,用它去统计次数,但是发现返回的要么是1要么是0,所以我觉得理解为是否会出现的话会更加贴切一点

 empty()         如果map为空则返回true

 end()           返回指向map末尾的迭代器

 equal_range()   返回特殊条目的迭代器对

 erase()         删除一个元素

 find()          查找一个元素

 get_allocator() 返回map的配置器

 insert()        插入元素

 key_comp()      返回比较元素key的函数

 lower_bound()   返回键值>=给定元素的第一个位置

 max_size()      返回可以容纳的最大元素个数

 rbegin()        返回一个指向map尾部的逆向迭代器

 rend()          返回一个指向map头部的逆向迭代器

 size()          返回map中元素的个数

 swap()           交换两个map

 upper_bound()    返回键值>给定元素的第一个位置

 value_comp()     返回比较元素value的函数

        主要就是理解这些方法吧,但是我觉得不一定会用得上,其实我觉得学习map更多的是去理解这种键值对的映射思想,因为对于我之前的解法一来说,我只是将键存入当作数组的下标,其实这也是一种思想,总之就是感觉会拓宽自己的思路吧。

#include<iostream>
#include<cstring>
#include<map>
#include<cmath>

using namespace std;
bool IsPrime(int n) {
	if (n < 2) return false;
	for (int i = 2; i < sqrt(n); i++) {
		if (n % 2 == 0) return false;
	}
	return true;
}
int main() {
	map<char, int> mp;
	int max = 0, min = 9999, ans;
	string str;
	cin >> str;
	//cout << str.length() << endl;
	for (int i = 0; i < str.length(); i++) {
		mp[str[i]]++;
	}
	//调用 begin()/end() 组合,遍历 map 容器
	for (auto iter = mp.begin(); iter != mp.end(); ++iter) {
		//cout << iter->first << " " << iter->second << endl;//此处用的是迭代器来查找的key和value;
		if (iter->second > max) max = iter->second;
		if(iter->second <min) min= iter->second;
	}
	//cout << max << " " << min << endl;
	ans = max-min;
	if(IsPrime(ans)){
		cout<<"Lucky Word"<<endl;
		cout<<ans;}
	else {
		cout << "No Answer" << endl << "0";}
	return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hooray11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值