蓝桥杯笔记

1.2024_CA_省C 训练士兵

贪心,排序

问题描述

在蓝桥王国中,有 n 名士兵,这些士兵需要接受一系列特殊的训练,以提升他们的战斗技能。对于第 i 名士兵来说,进行一次训练所需的成本为 pi​ 枚金币,而要想成为顶尖战士,他至少需要进行 ci  次训练。

为了确保训练的高效性,王国推出了一种组团训练的方案。该方案包含每位士兵所需的一次训练,且总共只需支付 S 枚金币(组团训练方案可以多次购买,即士兵可以进行多次组团训练)。

作为训练指挥官,请你计算出最少需要花费多少金币,才能使得所有的士兵都成为顶尖战士?

输入格式

第一行包含两个整数 n 和 S,表示士兵的数量和进行一次组团训练所需的金币数。

接下来的 n 行,每行包含两个整数 pi​ 和 ci​,表示第 i 名士兵进行一次训练的金币成本和要成为顶尖战士所需的训练次数。

输出格式

输出一个整数,表示使所有士兵成为顶尖战士所需的最少金币数。

样例输入

3 6
5 2
2 4
3 2

样例输出

16
import os
import sys

# 请在此输入您的代码
n,s = input().split()
p = []
n = int(n)
s = int(s)
m = 0
for i in range(n):
  pi,ci = input().split()
  p.append([int(pi),int(ci)])
  m += int(pi)
#输入

res = 0
pos = 0 #当前训练次数
p.sort(key = lambda x : x[1])#按升序排序训练次数

#次数少的士兵会先训练完,所以按升序排序可以尽可能的使用更多的团购次数(如果优惠)
for i in range(n):
  if m >= s:
    #团购更优惠,m代表当前剩余所有士兵单独训练一次所需的金币
    res += s * (p[i][1] - pos)
  else:
    #单独训练更优惠
    res += m * (p[i][1] - pos)
  pos = p[i][1] #更新训练次数
  m -= p[i][0]  #更新单独训练所需的金币总和
print(res)

2.2024_穿越时空之门

枚举

问题描述

随着 2024 年的钟声回荡,传说中的时空之门再次敞开。这扇门是一条神秘的通道,它连接着二进制和四进制两个不同的数码领域,等待着勇者们的探索。

在二进制的领域里,勇者的力量被转换成了力量数值的二进制表示中各数位之和。

在四进制的领域里,力量的转换规则相似,变成了力量数值的四进制表示中各数位之和。

穿越这扇时空之门的条件是严苛的:当且仅当勇者在二进制领域的力量等同于四进制领域的力量时,他才能够成功地穿越。

国王选定了小蓝作为领路人,带领着力量值从 1 到 2024 的勇者们踏上了这段探索未知的旅程。作为小蓝的助手,你的任务是帮助小蓝计算出,在这 2024 位勇者中,有多少人符合穿越时空之门的条件。

import os
import sys

n = 1
res = 0
def check(n: int,p: int):
  m = n
  r = 0
  while m:
    if m % p == 1:
      r += 1
    m //= p
  return r
for i in range(n, 2025):
  if check(i, 2) == check(i, 4):
    res += 1
print(res)

3.2024_数字串个数

数学,排列组合

问题描述

小蓝想要构造出一个长度为 10000 的数字字符串,有以下要求:

  1. 小蓝不喜欢数字 0,所以数字字符串中不可以出现 0;

  2. 小蓝喜欢数字 3 和 7,所以数字字符串中必须要有 3 和 7 这两个数字。

请问满足题意的数字字符串有多少个?这个数字会很大,你只需要输出其对 10**9+7 取余后的结果。

import os
import sys

# 请在此输入您的代码

#用总的次数 - 不包含3的 - 不包含7的 + 既不包含3也不包含7的(因为这部分减了两次)
n = 9**10000 - 2*8**10000 + 7**10000
mod = 10**9 + 7
print(n%mod)

4.召唤数学精灵

找规律

问题描述

数学家们发现了两种用于召唤强大的数学精灵的仪式,这两种仪式分别被称为累加法仪式 A(n) 和累乘法仪式 B(n)。

累加法仪式 A(n)是将从 1 到 n 的所有数字进行累加求和,即:A(n)=1+2+⋯+累乘法仪式 B(n) 则是将从 1 到 n 的所有数字进行累乘求积,即:B(n)=1×2×⋯×n据说,当某个数字 i 满足 A(i)−B(i) 能被 100整除时,数学精灵就会被召唤出来。

现在,请你寻找在 1 到 2024041331404202 之间有多少个数字 i,能够成功召唤出强大的数学精灵。

先输出1000以内的数看看有什么规律1,3,24,175,199,200,224,375,399,400,424,575,599,600,624,775,799,800,824,975,999,1000, 每两百个数末尾以24,75,99,00,除了1和3,直接计算得出结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

YoloMari

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

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

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

打赏作者

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

抵扣说明:

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

余额充值