今天拿出来了一点时间做了一下上年的真题(也就是上年考的)
时空之门
随着 2024 年的钟声回荡,传说中的时空之门再次敞开。这扇门是一条神秘的通道,它连接着二进制和四进制两个不同的数码领域,等待着勇者们的探索。
在二进制的领域里,勇者的力量被转换成了力量数值的二进制表示中各数位之和。
在四进制的领域里,力量的转换规则相似,变成了力量数值的四进制表示中各数位之和。
穿越这扇时空之门的条件是严苛的:当且仅当勇者在二进制领域的力量等同于四进制领域的力量时,他才能够成功地穿越。
国王选定了小蓝作为领路人,带领着力量值从
1 到 2024 的勇者们踏上了这段探索未知的旅程。作为小蓝的助手,你的任务是帮助小蓝计算出,在这
2024 位勇者中,有多少人符合穿越时空之门的条件。
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。答案:
#其实思路也是很简单的,写一个二进制转换,一个四进制转换就出来了,本题签到题
sums=0
N=2024
def getTsums(a):
Tsumsn=0
while(a):
m=a%2
a=a-m
a=a//2
Tsumsn+=m
return Tsumsn
def getFsums(a):
Fsumsn=0
while(a):
m=a%4
a=a-m
a=a//4
Fsumsn+=m
return Fsumsn
for i in range(1,N+1):
Tsums=getTsums(i)
Fsuns=getFsums(i)
if(Tsums==Fsuns):
sums+=1
print(sums)数字串个数
问题描述
小蓝想要构造出一个长度为 10000 的数字字符串,有以下要求:
小蓝不喜欢数字 0,所以数字字符串中不可以出现 0;
小蓝喜欢数字 3 和 7,所以数字字符串中必须要有 3 和 7这两个数字。
请问满足题意的数字字符串有多少个?这个数字会很大,你只需要输出其对 10^9+7 取余后的结果。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。答案
#本题思路为没有0的数字个数为9^10000个,没有3或者没有4的为8^10000+8^10000,但是其中有同时没有3和4的也就是7^10000个重复了,所以总数为(9^10000-2*8^10000+7^10000)
#代码如下
N=10000
re=(pow(9,N)-2*pow(8,N)+pow(7,N))%(pow(10,9)+7)
print(re)连连看
问题描述
小蓝正在和朋友们玩一种新的连连看游戏。在一个 n×mn×m 的矩形网格中,每个格子中都有一个整数,第 ii 行第 jj 列上的整数为 Ai,jAi,j 。玩家需要在这个网格中寻找一对格子 (a,b)−(c,d)(a,b)−(c,d) 使得这两个格子中的整数 Aa,bAa,b 和 Ac,dAc,d 相等,且它们的位置满足 ∣a−c∣=∣b−d∣>0∣a−c∣=∣b−d∣>0 。请问在这个 n×mn×m 的矩形网格中有多少对这样的格子满足条件。
输入格式
输入的第一行包含两个正整数 n,mn,m,用一个空格分隔。
接下来 nn 行,第 ii 行包含 mm 个正整数 Ai,1,Ai,2,⋯,Ai,mAi,1,Ai,2,⋯,Ai,m,相邻整数之间使用一个空格分隔。
输出格式
输出一行包含一个整数表示答案。
样例输入
3 2
1 2
2 3
3 2
样例输出
6
'''
题目大意:
对于每个坐标,在它的四个斜45°对角线方向上,有多少个坐标的值与当前坐标的值相同
两个坐标(x1,y1),(x2,y2)
满足条件|x1 - x2| = |y1 - y2| > 0
(x1,y1)
(x2,y2)
|x1 - x2|为两个坐标水平距离
|y1 - y2|为两个坐标垂直距离
两个距离相等且大于0,说明两个坐标不相等
并且处于一个45°的相对位置上
这题暴力枚举对角线方向固然可以,但时间复杂度对于python来说有点悬,即使在蓝桥oj上pypy3能通过
赛时也不能保证全对,(但是对于刚入门的朋友来说,暴力拿分反而是最好的一个方法)
因此下面给出一种较为高效的写法
如需暴力枚举对角线的写法
可查找我前一份题解
(0,0) (0,1) (0,2) (0,3) (0,4)
(1,0) (1,1) (1,2) (1,3) (1,4)
(2,0) (2,1) (2,2) (2,3) (2,4)
(3,0) (3,1) (3,2) (3,3) (3,4)
假设右对角线是 (左下) -> (右上)
(1,0) (0,1)是一对
(2,0) (1,1) (0,2)是一对
(3,0) (2,1) (1,2) (0,3) 是一对
不难发现,这类右对角线中坐标(i,j)
i + j 为一个定值
假设左对角线是 (左上) -> (右下)
(0,3) (1,4)是一对
(0,2) (1,3) (2,4)是一对
(0,1) (1,2) (2,3) (3,4)是一对
不难发现,这类左对角线中坐标(i,j)
i - j 为一个定值
因此
当我们遍历到一个坐标(i,j)时
需要找到之前 左右对角线 有多少个和当前坐标(i,j)值一样的
需要用一个哈希记录一下到当前位置为止,左右对角线中某个值x已经出现了多少次
累加一下
因为要求坐标对数
(1,2) -> (2,1) 和 (2,1) -> (1,2) 算两个答案
所以最后答案 * 2
有同学没理解为什么是答案*2,而认为是A(ans,2)
下面来解释一下
假设某个对角线上有5个相同值的坐标
1 2 3 4 5
两两组合
按我代码的思路是
初始化ans = 0
vis[x] 为x出现的次数
遍历到第一个:ans + 0,vis[x] + 1 当前ans = 0,vis[x] = 1
遍历到第二个:ans + 1,vis[x] + 1 当前ans = 1,vis[x] = 2 坐标对数为(1,2)
遍历到第三个:ans + 2,vis[x] + 1 当前ans = 3,vis[x] = 3 坐标对数为(1,3),(2,3)
遍历到第四个:ans + 3,vis[x] + 1 当前ans = 6,vis[x] = 4 坐标对数为(1,4),(2,4),(3,4)
遍历到第五个:ans + 4,vis[x] + 1 当前ans = 10,vis[x] = 5 坐标对数为(1,5),(2,5),(3,5),(4,5)
但(1,2) -> (2,1) 和 (2,1) -> (1,2) 算两个答案
所以答案 * 2
其实两两组合确实是排列数A(m,2)
可是这里的m是ans吗?
上面的例子来看,这组答案应该是A(5,2)表示从五个数中选两个数来排列
可见这里的m指的是在某个对角线上相同值的坐标个数
而我这ans记录的和这个个数并无关系,所以不能这么写
可能有朋友不清楚python中的Counter和defaultdict是干什么的
这两个类似于基础语法中学的字典,具有键值对的性质
这两个一般来说没什么区别,习惯哪个用哪个
比起普通的字典,
如Counter(a)可以直接对列表里元素出现次数进行计数,简洁一点
而且会给没出现的元素赋值为0,避免像字典一样取到不存在的值会报错
当然,分别用一个二维数组计数也可以,如果Aij的值到达了1e9就不可用数组了哦~
看到这里觉得有用就点个赞呗!!!
><
'''
def main():
n, m = map(int, input().split())
g = []
for _ in range(n):
g.append(list(map(int, input().split())))
ans = 0
from collections import Counter,defaultdict
# 不会字典的可以使用数组计数也行
# right = [[0] * 1005 for i in range(2005)]
# left = [[0] * 1005 for i in range(2005)]
right = defaultdict(Counter)
left = defaultdict(Counter)
for i in range(n):
for j in range(m):
x = g[i][j]
ans += right[i + j][x] + left[j - i][x]
# 以 (i,j) 为右对角线的哈希值
right[i + j][x] += 1
# 以 (i,j) 为左对角线的哈希值
left[j - i][x] += 1
print(ans * 2)
return
main()神奇闹钟
问题描述
小蓝发现了一个神奇的闹钟,从纪元时间(1970 年 1 月 1 日 00:00:00)开始,每经过 x 分钟,这个闹钟便会触发一次闹铃 (纪元时间也会响铃)。这引起了小蓝的兴趣,他想要好好研究下这个闹钟。
对于给出的任意一个格式为 уууу-MM-ddHH:mm:ss 的时间,小蓝想要知道在这个时间点之前 (包含这个时间点) 的最近的一次闹铃时间是哪个时间?
注意,你不必考虑时区问题。
输入格式
输入的第一行包含一个整数 T,表示每次输入包含 T组数据。
接下来依次描述 T 组数据。
每组数据一行,包含一个时间(格式为 уууу-MM-ddHH:mm:ss)和一个整数 x,其中 x表示闹铃时间间隔(单位为分钟)。
输出格式
输出 T 行,每行包含一个时间(格式为 уууу-MM-ddHH:mm:ss),依次表示每组数据的答案。
样例输入
2
2016-09-07 18:24:33 10
2037-01-05 01:40:43 30
样例输出
2016-09-07 18:20:00
2037-01-05 01:30:00
评测用例规模与约定
保证所有的时间格式都是合法的。
#本题纯粹考察对时间库的掌握和理解
from datetime import datetime
from datetime import timedelta
start="1970-01-01 00:00:00"
datestarttime=datetime.strptime(start,"%Y-%m-%d %H:%M:%S")
N=int(input())
re=[]
for i in range(N):
M,N,k=input().split()
M=M+" "+N
nowdate=datetime.strptime(M,"%Y-%m-%d %H:%M:%S")
de=nowdate-datestarttime
de=int(de.total_seconds())
k=int(k)*60
ll=de-(de%k)
nowdate=datestarttime+timedelta(seconds=ll)
re.append(nowdate)
for i in re:
print(i)
蓝桥村的真相
问题描述
在风景如画的蓝桥村,n 名村民围坐在一张古老的圆桌旁,参与一场思想的较量。这些村民,每一位都有着鲜明的身份:要么是誉满乡野的诚实者,要么是无可救药的说谎者。
当会议的钟声敲响,一场关于真理与谬误的辩论随之展开。每位村民轮流发言,编号为 ii 的村民提出了这样的断言:坐在他之后的两位村民 — 也就是编号 i+1 和 i+2(注意,编号是环形的,所以如果 ii是最后一个,则 i+1 是第一个,以此类推)之中,一个说的是真话,而另一个说的是假话。
在所有摇曳不定的陈述中,有多少真言隐藏在谎言的面纱之后?
请你探索每一种可能的真假排列组合,并计算在所有可能的真假组合中,说谎者的总数。
输入格式
第一行输入一个整数 T,表示数据的组数。
接下来 T 行,每行包含一个整数 n,表示村落的人数。
输出格式
对于每组数据,输出一行包含一个整数,表示答案。
样例输入
1
3
样例输出
6
样例说明
在样例中,可能的组合有 「假,假,假」「真,真,假」「真,假,真」「假,真,真」,说谎者的总数为 3+1+1+1=6
#这题其实就两种情况分为能被n能被三整除和不能被3整除
#不能的话只能是全部假话
#能得话分为四种情况,全部都是假话那就是n个,分别为 110110110.... 101101101.... 011011011.... 也就是总共为2n
#ps:这题该放在填空
T=int(input())
re=[]
for i in range(T):
n=int(input())
if(n%3):
re.append(n)
else:
re.append(2*n)
for i in re:
print(i)