锋哥蓝桥杯刷题之路(二)

1.L1-020 帅到没朋友 

 

输入格式:

输入第一行给出一个正整数N(≤100),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M(≤10000),为待查询的人数;随后一行中列出M个待查询的ID,以空格分隔。

注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有K超过1的朋友圈里都至少有2个不同的人。

输出格式:

按输入的顺序输出那些帅到没朋友的人。ID间用1个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出No one is handsome

注意:同一个人可以被查询多次,但只输出一次。

输入样例1:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888

输出样例1:

10000 88888 23333

输入样例2:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111

输出样例2:

No one is handsome

解析: 看待查找的ID在已经输入存储的ID中是否有重复的,如果有就不算“帅的没朋友”不用输出,反之就要输出那些没有在朋友圈的ID。但要注意的就是去重一是:在输入朋友圈每个人的ID时,有些人会重复添加,需要除去重复的。二是:在输出每个朋友圈都查找不到的ID的时候,这些ID会重复查找,但我们只需要输出一次。还有就是没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人,需要去掉此人的朋友圈,因为他根本没有朋友。

代码附上:

li1 = set()  # 储存每个朋友圈的每个人的ID
n = int(input())  # 一共有几个朋友圈
for i in range(n):
    people = input().split(' ')
    # 朋友圈只有自己的人
    if people[0] == '1':
        pass
    else:
        for x in people[1:]:
            li1.add(x)
w = int(input())  # 为待查询人数
li2 = input().split()  # 待查询人的每个人的ID
no_friends = set() # 存储已近查找过的ID
no_friends_list = []  # 存储没有朋友的人的ID
for i in li2:
     #如果没有查找过且不在朋友圈的ID存储在列表中
    if (i not in li1 and i not in no_friends):
        no_friends.add(i)
        no_friends_list.append(i)

if len(no_friends_list) == 0:
    print('No one is handsome')
else:
    print(' '.join(no_friends_list))

ps:蓝桥杯快开始了,希望自己加油啊,到现在好多蓝桥杯的题都不会做。希望到时候回头看的时候没有辜负这些时光!

 2.蓝桥杯-直线 

 解析:设置一个矩阵去存储每个点,并且根据斜率公式和截距公式,判断有多少个不同的直线

ju = [[x, y] for x in range(20) for y in range(21)]  # 创建矩阵
queue = set()  # 重复的(斜率,截距)可以清除
for i in ju:
    x1, y1 = i[0], i[1]
    for w in ju:
        x2, y2 = w[0], w[1]
        if x1 == x2:  # 因为使用斜率公式 分母为x2-x1 所以不能为0
            continue
        k = (y2 - y1) / (x2 - x1)  # 斜率公式
        b = (x2 * y1 - x1 * y2) / (x2 - x1)  # 截距公式
        if (k, b) not in queue:
            queue.add((k, b))
print(len(queue) + 20)

3.蓝桥杯-单词分析

题目描述

小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。

现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。

输入描述

输入一行包含一个单词,单词只由小写英文字母组成。

对于所有的评测用例,输入的单词长度不超过 1000。

输出描述

输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。

第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。

代码附上:

dic1 = {}
s = input()
s = list(s)
s.sort() 按字典顺序 进行升序排序
s = ''.join(s)
for i in s:
    dic1[i] = s.count(i) #字典i的键 对应的值是字符i出现的次数
print(max(dic1,key=dic1.get)) #出现次数最多的字符串 get() 函数返回指定键的值,如果值不在字典中返回默认值。
q = max(dic1,key=dic1.get)
print(dic1[q]) #打印出现最多字符的次数

ps:蓝桥杯马上快开始了,希望自己加油弄英语和比赛,不要又想得到又不想付出!!!!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
题目描述 电子产品中,通常用 EEPROM 存储程序和数据,而 EEPROM 的容量和读写速度相比 RAM 要小和慢得多,因此 EEPROM 被广泛应用于存储程序配置信息、数据备份等不需要高速读写的场合。为了提高 EEPROM 的读写速度,可以使用更高级别的技术,例如缓存、压缩、DMA 等。 现在,您需要完成一组 EEPROM 相关的操作模拟,包括写入操作、读取操作、写入缓存操作、从缓存读取操作,具体如下: - 写入操作:从固定地址 addr 开始,连续写入 len 个字节的数据 data,其中 len <= 1024,每个字节的值为 0-255,如写入 {1,2,3,4,5} 到地址 10,即为0x0A,则地址 10-p 的值为 1,地址 p+1 的值为 2,直到地址 p+len-1 的值为 5。 - 读取操作:从固定地址 addr 开始,连续读取 len 个字节的数据 data,其中 len <= 1024,将读取到的数据存储到数组 data 中,如从地址 10-p 中读取长度为 5 的数据,则读取到的数据为 {1,2,3,4,5}。 - 写入缓存操作:从固定地址 addr 开始,连续将 len 个字节的数据 data 写入到内部缓存,其中 len <= 1024,每个字节的值为 0-255,如写入 {1,2,3,4,5} 到地址 10,即为0x0A,则缓存内 0-p 的值为 1,缓存内 p+1 的值为 2,直到缓存内 p+len-1 的值为 5。 - 从缓存读取操作:从固定地址 addr 开始,连续从内部缓存中读取 len 个字节的数据 data,其中 len <= 1024,将读取到的数据存储到数组 data 中,如从地址 10-p 中读取长度为 5 的数据,则缓存内的数据还是不变的,读取到的数据为 {1,2,3,4,5}。 题目分析 这道题目的本意是通过位运算来实现读写操作,需要熟练掌握位运算技巧,个人感觉难度偏高。但是可以选择暴力做法:用数组模拟写入、读取、缓存操作,但是这样显然没有熟练掌握位运算技巧更加有利。 代码实现 暴力做法 这里就不给出实现,感觉也比较简单,有兴趣的可以自己思考。 位运算做法 在本篇文章中,我们将采用位运算来实现读写缓存操作,下面分别说明。 时间和空间复杂度 算法时间复杂度:O(len) 算法空间复杂度:O(1) 思路 在编程中,操作硬件的数据往往以位为单位,这是由硬件的特殊性决定的。本题中如果仅仅使用常规数组来完成读写操作,在比较位运算技巧的同学面前会显得不那么高端,因此在下面我们将采用位运算的方式来进相应的操作。 读数据 假设我们要从地址 addr 开始读 len 个字节,按位运算的做法如下: for(int i=0;i<len;i++) { byte[i] = ~pgm_read_byte_near(addr+i) & 0xff; } 其中 pgm_read_byte_near 是一个库函数,可以实现从 flash memory 中读取一个字节数据。由于 EEPROM 属于 flash memory,所以该函数可以读取 EEPROM 中的数据。 总体来说,这个语句执起来比较耗时,但是在数据量不大的情况下,应该不会引起问题。我们的目标是在数量很大的情况下,也能够使用位运算的方式快速地读取数据,下面介绍具体的实现方法。 注意到我们已经处理的字节只有 byte[0]~byte[j-1],那么在处理完 byte[j] 后,我们将完成的部位保存到 byte[j] 中。不妨假设从字节的第 k 位开始,第 k~k+7 位等于我们要读的 len-j 个字节的内容,那么完全可以通过移位 (>>k),加法、位运算 (|) 来快速实现读取操作,具体代码如下: uint8_t temp = 0; for(int i=0;i<len;i++) { if(i%8 == 0) //记录的字节已处理完毕,需要读取新的字节 { temp = ~pgm_read_byte_near(addr+(j++)) & 0xff; } byte[i] = (temp>>(i%8)) & 1; } 写数据 假设我们要从地址 addr 开始写 len 个字节,按位运算的做法如下: for(int i=0;i<len;i++) { uint8_t a = ~byte[i] & 1; uint16_t p = addr+i; uint8_t r = pgm_read_byte_near(p) & (~(1<<a)); uint8_t w = r | (byte[i]<<a); pmg_write_byte_near(p,w); } 其中,pmg_write_byte_near 是一个库函数,可以实现向 flash memory 中写入一个字节数据。由于 EEPROM 属于 flash memory,所以该函数可以写入 EEPROM 中的数据。 同样地,这个语句执起来也比较耗时,因此在下面我们将采用位运算的方式来进相应的操作。 写入缓存 假设我们要从地址 addr 开始写 len 个字节到缓存中,那么按位运算的做法如下: for(int i=0;i<len;i++) { uint8_t a = ~byte[i] & 1; uint16_t p = addr+i; cache[p] |= (byte[i]<<a); } cache 是一个数组,用来存储缓存数据。 从缓存读取 假设我们要从地址 addr 开始读取 len 个字节,按位运算的做法如下: uint8_t temp; for(int i=0;i<len;i++) { uint8_t a = ~byte[i] & 1; uint16_t p = addr+i; temp = (cache[p]>>a) & 1; byte[i] = ~temp & 1; } cache 是一个数组,用来存储缓存数据。 测试与运效果 模拟器 模拟器输出截图如下: 本地测试 用C++代码实现,本地环境由 Debian Linux 系统,GNU GCC 编译器,125MHz的 ATmega128Lc 单片机(仿真环境)组成。本题测试结果均通过。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

superb_code

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值