首页 > 其他分享 >[NOIP2008 提高组] 笨小猴——map的应用

[NOIP2008 提高组] 笨小猴——map的应用

时间:2024-10-31 20:31:09浏览次数:1  
标签:map 函数 样例 元素 NOIP2008 单词 笨小猴 myMap

题目描述

笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!

这种方法的具体描述如下:假设 \(\text{maxn}\) 是单词中出现次数最多的字母的出现次数,\(\text{minn}\) 是单词中出现次数最少的字母的出现次数,如果 \(\text{maxn}-\text{minn}\) 是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。

输入格式

一个单词,其中只可能出现小写字母,并且长度小于 \(100\)。

输出格式

共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那么输出 Lucky Word,否则输出 No Answer

第二行是一个整数,如果输入单词是 Lucky Word,输出 \(\text{maxn}-\text{minn}\) 的值,否则输出 \(0\)。

样例 #1

样例输入 #1

error

样例输出 #1

Lucky Word
2

样例 #2

样例输入 #2

olympic

样例输出 #2

No Answer
0

提示

【输入输出样例 1 解释】

单词 error 中出现最多的字母 \(\texttt r\) 出现了 \(3\) 次,出现次数最少的字母出现了 \(1\) 次,\(3-1=2\),\(2\) 是质数。

【输入输出样例 2 解释】

单词 olympic 中出现最多的字母 \(\texttt i\) 出现了 \(1\) 次,出现次数最少的字母出现了 \(1\) 次,\(1-1=0\),\(0\) 不是质数。

(本处原题面错误已经修正)

noip2008 提高第一题

总结反思

我的作答

#include <bits/stdc++.h>
using namespace std;
bool isPrime(int n) {
	if (n<2) return 0;
	for (int i=2;i*i<=n;i++) {
		if (n%i==0) {
			return 0;
		}
	}
	return 1;
}

int main() {
	char ch;
	int maxn=0,minn=100;
	int result;
	map<char, int> mymap;
	while ((ch=getchar())!='\n') {
		mymap[ch]++;
	}
	for (int ch1='a';ch1<='z';ch1++) {
		maxn=max(maxn, mymap[ch1]);
		if (mymap[ch1]!=0) {
			minn=min(minn, mymap[ch1]);
		}
	}
	result = maxn - minn;
	if (isPrime(result)) {
		cout << "Lucky Word" << endl;
		cout << result << endl;
	} else {
		cout << "No Answer" << endl;
		cout << 0;
	}
	return 0;
}

总结

(一)map的用法

  1. 基本概念

    • 在 C++ 中,map是一种关联容器,它存储的是键 - 值(key - value)对。就像是一本字典,其中的 “单词” 是键(key),“单词的释义” 是值(value)。map中的元素是按照键进行自动排序的,默认是按照键的升序排列。
    • 它的定义在<map>头文件中,语法格式为map<键的数据类型, 值的数据类型> 变量名;。例如,map<int, string> myMap;定义了一个map,其中键是整数类型,值是字符串类型。
  2. 插入元素

    • 使用insert函数插入
      • 可以使用insert函数向map中插入元素。例如,myMap.insert(make_pair(1, "one"));,这里make_pair函数用于创建一个包含键和值的pair对象,然后将这个pair插入到map中。也可以写成myMap.insert(std::pair<int, string>(1, "one"));
    • 使用下标操作插入(注意事项)
      • 还可以使用下标操作符[]来插入元素。例如,myMap[2] = "two";。但是需要注意的是,当使用下标操作符插入元素时,如果键不存在,会自动创建一个新的键 - 值对。这可能会导致意外的键插入。例如,如果只是想检查键是否存在而不小心使用了[]操作符,就可能会插入一个新的不需要的元素。
  3. 访问元素

    • 使用下标操作符访问

      • 可以通过键来访问map中的值。例如,string value = myMap[1];,这里通过键1来获取对应的字符串值。但是如果键不存在,使用下标操作符会插入一个新的键 - 值对,其中值会被默认初始化(对于基本类型,如int会初始化为 0,对于类类型会调用默认构造函数)。
    • 使用at函数访问

      更安全的方式是使用at函数来访问元素。例如,try{string value = myMap.at(1);}catch(const std::out_of_range& e){// 处理键不存在的情况}。当键不存在时,at函数会抛出一个out_of_range异常,这样可以更好地处理键不存在的情况。

  4. 遍历元素

    • 可以使用迭代器来遍历map中的元素。例如:
     for (map<int, string>::iterator it = myMap.begin(); it!= myMap.end(); ++it) {
         cout << "键: " << it->first << ",值: " << it->second << endl;
     }
  • 这里it->first表示键,it->second表示值。从begin开始,一直到end结束(end指向最后一个元素的下一个位置),通过迭代器逐步访问map中的每一个键 - 值对。
  1. 删除元素
  • 可以使用erase函数来删除map中的元素。例如,myMap.erase(1);会删除键为1的键 - 值对。也可以通过迭代器来删除元素,例如:
     map<int, string>::iterator it = myMap.find(1);
     if (it!= myMap.end()) {
         myMap.erase(it);
     }
  • 这里先使用find函数查找键为1的元素,如果找到(find函数返回的迭代器不等于end),就使用erase函数删除该元素。
  1. 查找元素
  • 使用find函数查找
    • mapfind函数用于查找指定键的元素。例如,map<int, string>::iterator it = myMap.find(1);,如果找到键为1的元素,it会指向该元素,否则it会等于myMap.end()
  • 使用count函数查找
    • count函数用于统计指定键出现的次数。在map中,键是唯一的,所以count函数返回的值要么是 0(键不存在),要么是 1(键存在)。例如,int count = myMap.count(1);可以用来检查键1是否存在。

(二)易错点:统计最小出现次数时,先保证字母数量不为零

	for (int ch1='a';ch1<='z';ch1++) {
		maxn=max(maxn, mymap[ch1]);
		if (mymap[ch1]!=0) {
			minn=min(minn, mymap[ch1]);
		}
	}

标签:map,函数,样例,元素,NOIP2008,单词,笨小猴,myMap
From: https://www.cnblogs.com/xiins/p/18518835

相关文章

  • Java——lambda表达式和StreamAPI
    一、lambda1. lambda表达式1.1Lambda表达式的使用举例:(o1,02)->Integer.compare(o1,o2);1.2Lambda表达式的格式举例:Lambda形参列表->lambda1.3Lambda表达式的格式lambda操作符或箭头操作符的左边:lambda形参列表,对应着要重写的接口中的抽象方法的形参列表。的右......
  • 用哈希表封装myunordered_map和myunordered_set
    在学习这个之前,已经学习过,myunordered_map和myunordered_set的基本用法和哈希表怎么用哈希思想模拟实现;因此为了更深入的了解myunordered_map和myunordered_set与哈希表的内容,我们来自己用哈希表模拟实现myunordered_map和myunordered_set;这种模拟实现和之前模拟实现map与set......
  • java8 map每10个分一组
    在Java8中,如果你想要将一个Map的条目每10个分为一组,你可以使用流(Streams)来实现这一功能。这里是一个例子,假设我们有一个Map<Integer,String>,我们想要将其每10个元素分为一组。首先,我们需要将Map的entrySet()转换为流,然后使用流的操作来实现分组。 importjava.util.......
  • Regmap API驱动框架
    系列文章目录嵌入式硬软件基础知识RegmapAPI驱动框架系列文章目录RegmapAPI驱动框架结构RegmapAPI驱动框架结构regmap框架分为三层:①、底层物理总线:regmap就是对不同的物理总线进行封装,目前regmap支持的物理总线有i2c、i3c、spi、mmio、sccb、sdw、s......
  • mybatis Mapper代理开发
    MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。Mapper是MyBatis中用于定义SQL语句和映射规则的接口或XML文件。下Mapper接口定义方式:Mapper接口用于定义SQL操作的抽象方法,不需要实现类。注解方式:可以使用注解(如@Select,@Insert,@Upda......
  • rust中map和set的基本使用
    1.HahsMaphttps://rustwiki.org/zh-CN/std/collections/struct.HashMap.html跟着文档,查看一下hashmap的方法,调试,输出一下,就能学会使用了。usestd::collections::HashMap;usestd::any::type_name;//输出变量类型fnprint_type_of<T>(_:&T){println!("{}",type_name......
  • 端侧芯片(海思、RK、寒武纪、Ascend等)测试检测模型map流程
    1.准备数据集,做好相应尺寸代码中示例为320,从原始大图变成320*320,加上letterbox和坐标变换importosimportshutilfromtqdmimporttqdmimportcv2defmy_letter_box(img,size=(320,320)):#h,w,c=img.shaper=min(size[0]/h,size[1]/w)new_h,new_w......
  • jmap 内存分析工具学习
    内存分析工具jmap学习下面以java8为例,java9之后jmap的命令有一些变化。一.jps找到当前java程序的进程id查看java堆信息jmap-heap-pid[对应的进程id]查看java堆中对象,|more是不要一下子打印太多对象,按回车就能接着看剩下的对象jmap-histo:live[进程id]|more......
  • redis详细教程(3.ZSet,Bitmap,HyperLogLog)
    ZSetRedis的ZSet(有序集合)是一种特殊的数据类型,它允许存储一系列不重复的字符串元素,并为每个元素关联一个分数(score)。这个分数用于对集合中的元素进行排序。ZSet的特点是:唯一性:集合中的每个元素都是唯一的。可排序性:元素可以根据分数进行排序。内部实现:ZSet的内部实现......
  • 从 GC 到 WeakMap、WeakSet
    一、内存泄漏1.1简介内存泄漏:指计算机科学中的一种资源泄漏,主要是因为计算机程序内存管理疏忽或错误造成程序未能释放已经不再使用的内存,因而失去对一段已分配内存空间的控制,程序将继续占用已不再使用的内存空间,或是存储器所存储的对象,无法通过执......