蓝桥杯python练习一

1.排列字母

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝要把一个字符串中的字母按其在字母表中的顺序排列。

例如,LANQIAO 排列后为 AAILNOQ。

又如,GOODGOODSTUDYDAYDAYUP 排列后为AADDDDDGGOOOOPSTUUYYY。

请问对于以下字符串,排列之后字符串是什么?

WHERETHEREISAWILLTHEREISAWAY

运行限制
最大运行时间:1s
最大运行内存: 512M
string = input()
dict = {}
for s in string:
    if s not in dict.keys():
        dict[s]=1
    else:
        dict[s]+=1
dict2 = sorted(dict.items())
# print(dict2)
for i in range(len(dict2)):
    for j in range(dict2[i][1]):
      print(dict2[i][0],end="")
s = str(input())#这个快很多
in2 = list(s)
in2.sort()
for i in in2:
    print(i,end="")

2.寻找整数 ×

问题描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

有一个不超过 10^{17}1017
的正整数 nn,知道这个数除以 2 至 49 后的余数如下表所示,求这个正整数最小是           多少。

图片描述

运行限制
最大运行时间:1s
最大运行内存: 512M

3.纸张尺寸

问题描述
在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm \times× 841mm,      将 A0 纸 沿长边对折后为 A1 纸, 大小为 841mm \times× 594mm, 在对折  的过程中长度直接取 下整 (实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸, 依此类推。

输入纸张的名称, 请输出纸张的大小。

输入格式
输入一行包含一个字符串表示纸张的名称, 该名称一定是 A0、A1、A2、 A3、A4、A5、A6、A7、A8、A9 之一。

输出格式
输出两行,每行包含一个整数,依次表示长边和短边的长度。

样例输入1
A0
copy
样例输出1
1189
841
copy
样例输入 2
A1
copy
样例输出 2
841
594
copy
运行限制
最大运行时间:1s
最大运行内存: 512M
ask = input()
a = int(ask[1])
# print(a)
l = 1189
w = 841
if a==0:
  print(l)
  print(w)
else:
  for i in range(a):
      tmp = l//2
      l = max(tmp,w)
      w = min(tmp,w)
  print(l)
  print(w)

4.数位排序

问题描述
	小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。

例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。

又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。

给定正整数 n, mn,m, 请问对 1 到 nn 采用这种方法排序时, 排在第 mm 个的元 素是多少?

输入格式
输入第一行包含一个正整数 nn 。

第二行包含一个正整数 mm 。

输出格式
输出一行包含一个整数, 表示答案。

样例输入
13
5
copy
样例输出
3
copy
样例说明
1 到 13 的排序为: 1,10,2,11,3,12,4,13,5,6,7,8,91,10,2,11,3,12,4,13,5,6,7,8,9 。第 5 个数为 3 。

评测用例规模与约定
对于 30 \%30% 的评测用例, 1 \leq m \leq n \leq 3001≤m≤n≤300 。

对于 50 \%50% 的评测用例, 1 \leq m \leq n \leq 10001≤m≤n≤1000 。

对于所有评测用例, 1 \leq m \leq n \leq 10^{6}1≤m≤n≤10 
6
  。

运行限制
最大运行时间:3s
最大运行内存: 512M
n = int(input())
m = int(input())
li = list(range(1,n+1))
li.sort(key=lambda x:sum(int(i) for i in str(x)))
print(li[m-1])                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

5.蜂巢 ×

没搞懂这个题目的考察点,模拟?但是实际的模拟又很简单。

6.消除游戏 ×看已交的全过题解

这个还好,几乎一半超时
问题描述
在一个字符串 SS 中, 如果 S_{i}=S_{i-1}S
i

=S
i−1

且 S_{i} \neq S_{i+1}S
i


=S 
i+1
​
 , 则称 S_{i}S 
i
​
  和 S_{i+1}S 
i+1
​
  为边缘 字符。如果 S_{i} \neq S_{i-1}S 
i
​
 

=S 
i−1


且 S_{i}=S_{i+1}S
i

=S
i+1

, 则 S_{i-1}S
i−1

和 S_{i}S
i
​ 也称为边缘字符。其它的字符 都不是边缘字符。

对于一个给定的串 SS, 一次操作可以一次性删除该串中的所有边缘字符 (操作后可能产生新的边缘字符)。

请问经过 2^{64}2 
64
  次操作后, 字符串 SS 变成了怎样的字符串, 如果结果为空则 输出 EMPTY。

输入格式
输入一行包含一个字符串 SS。

输出格式
输出一行包含一个字符串表示答案,如果结果为空则输出 EMPTY。

样例输入 1
edda
copy
样例输出 1
EMPTY
copy
样例输入 2
sdfhhhhcvhhxcxnnnnshh
copy
样例输出 2
s
copy
评测用例规模与约定
对于 25 \%25% 的评测用例, |S| \leq 10^{3}∣S∣≤10 
3
 , 其中 |S|∣S∣ 表示 SS 的长度;

对于 50 \%50% 的评测用例, |S| \leq 10^{4}∣S∣≤10 
4
 ;

对于 75 \%75% 的评测用例, |S| \leq 10^{5}∣S∣≤10 
5
 ;

对于所有评测用例, |S| \leq 10^{6}, S∣S∣≤10 
6
 ,S 中仅含小写字母。

运行限制
最大运行时间:5s
最大运行内存: 512M
s = input()
S = s

while True:
    b = len(S)
    vis = [0]*b
    for i in range(1,len(S)-1):
        if(S[i]==S[i+1])and (S[i-1]!=S[i]):
            vis[i-1]=vis[i]=1
        if(S[i-1]==S[i])and(S[i]!=S[i+1]):
            vis[i]=vis[i+1]=1
    stmp=[]
    for i in range(len(S)):
        if vis[i]==0:
            stmp.append(S[i])
    if len(stmp)==len(S):
        print("".join(S))
        break
    if (len(stmp))==0:
        print("EMPTY")
        break
    S = stmp
    

7.全排列的价值

发现数据中的巧妙
问题描述
对于一个排列 A=\left(a_{1}, a_{2}, \cdots, a_{n}\right)A=(a 
1
​
 ,a 
2
​
 ,⋯,a 
n
​
 ), 定义价值 c_{i}c 
i
​
  为 a_{1}a 
1
​
  至 a_{i-1}a 
i−1
​
  中小于 a_{i}a 
i
​
  的数 的个数, 即 c_{i}=\mid\left\{a_{j} \mid j<i, a_{j}<a_{i}\right\} |_{\text {。 }}c 
i
​
 =∣{a 
j
​
 ∣j<i,a 
j
​
 <a 
i
​
 }∣ 
。 
​
 
定义 AA 的价值为 \sum_{i=1}^{n} c_{i}∑ 
i=1
n
​
 c 
i
​
  。

给定 nn, 求 1 至 nn 的全排列中所有排列的价值之和。

输入格式
输入一行包含一个整数 nn 。

输出格式
输出一行包含一个整数表示答案, 由于所有排列的价值之和可能很大, 请 输出这个数除以 998244353 的余数。

样例输入 1
3
copy
样例输出 1
9
copy
样例输入 2
2022
copy
样例输出 2
593300958
copy
样例说明
1 至 3 构成的所有排列的价值如下:
\begin{aligned} &(1,2,3): 0+1+2=3 \\ &(1,3,2): 0+1+1=2 \\ &(2,1,3): 0+0+2=2 \\ &(2,3,1): 0+1+0=1 \\ &(3,1,2): 0+0+1=1 \\ &(3,2,1): 0+0+0=0 \end{aligned}
​
  
(1,2,3):0+1+2=3
(1,3,2):0+1+1=2
(2,1,3):0+0+2=2
(2,3,1):0+1+0=1
(3,1,2):0+0+1=1
(3,2,1):0+0+0=0
​
 
故总和为 3+2+2+1+1=93+2+2+1+1=9 。

评测用例规模与约定
对于 40 \%40% 的评测用例, n \leq 20n≤20;

对于 70 \%70% 的评测用例, n \leq 5000n≤5000;

对于所有评测用例, 2 \leq n \leq 10^{6}2≤n≤10 
6
  。

运行限制
最大运行时间:1s
最大运行内存: 512M
n = int(input())
s = n*(n-1)/4
for i in range(1,n+1):
    s*= i
    s %=998244353
print(int(s))

8.技能提升×

这个有点像那个背包问题,有趣,有意思
是不是动态规划,之后多写几个,有趣
居然是二分,之后再次回顾

9.最长不下降序列×

这个好像是动态规划,值得回顾。

10.最优清零方案

好熟悉,好像cf写过的简单题。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

~晚风微凉~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值