第十三届蓝桥杯大赛湖南中医药大学第1场选拔赛总结

2103: ICPC

[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB
题目描述
ICPC是国际大学生程序设计竞赛(International Collegiate Programming Contest)的简称,是全球最具影响力的大学生程序设计竞赛。
小Kimi的目标是长大之后能够参加ICPC全球总决赛(World Final),为此他在努力学习编程。
为了表达对ICPC的热爱,他决定编写一个程序,输入一个正整数N,输出N个连续的ICPC,同时他希望所有位于奇数位置的ICPC全部用大写字母,而偶数位置的ICPC全部用小写字母,即“icpc”。你试试能不能写出来?
输入
单组输入。
输入一个正整数N,N<=100。
输出
输出一行,包含N个连续的“ICPC”,其中奇数位置的ICPC全部用大写字母,而偶数位置的ICPC全部用小写字母。
样例输入 Copy
3
样例输出 Copy
ICPCicpcICPC
代码:

f=['ICPC','icpc']
while True:
    n=int(input())
    for i in range(n): 
        print(f[i%2],end="")
    print()

2047: 三维迷宫

[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
小米同学在MC(“我的世界”)游戏中用积木块搭建了一个三维迷宫。
在三维迷宫中,X轴对应东西方向(东为正,西为负),Y轴对应南北方向(北为正,南为负),Z轴对应上下方向(上为正,下为负)。
现在小米在游戏中所控制的人物角色的初始坐标位置是(x, y, z),每接收到一个指令字符,角色将朝对应的方向移动一个单位长度。
在游戏中一共包含六个指令字符,“E”表示往东移动,“W”表示往西移动,“S”表示往南移动,“N”表示往北移动,“U”表示往上移动,“D”表示往下移动。
请问在执行一组移动指令后,人物角色的最终位置是多少?请按照X、Y和Z的顺序输出。
输入
单组输入。
第1行输入三个整数x、y和z,表示人物角色的初始坐标位置。其中,-1000<=x,y,z<=1000。两两之间用英文空格隔开。
第2行输入一个由六种字符“E”、“W”、“S”、“N”、“U”和“D”组成的字符串,字符串的长度不超过1000。
输出
输出移动之后人物角色的最终位置,按照X、Y和Z的顺序输出,两两之间用英文空格隔开。
样例输入 Copy
0 0 0
EWESNDUS
样例输出 Copy
1 -1 0
代码:

while True:
    x,y,z=map(int,input().split())
    s=list(input())
    for t in s:
        if t=='E':
            x+=1
        if t=='W':
            x-=1
        if t=='S':
            y-=1
        if t=='N':
            y+=1
        if t=='U':
            z+=1
        if t=='D':
            z-=1
    print(x,y,z)

2062: X星间谍

[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
X星最近潜入了很多来自别的星球的间谍。
X星首领下令在X星都城门口实施实名登记制,每一个进出X星都城的人都需要登记。进城门时需要登记一下编号,出城门时需要再登记一下编号。
X星首领获得了一个疑似间谍的人的编号清单,假定最开始时所有疑似间谍的人都在城外。现在给出N个已经登记的编号(同一个人进城门和出城门的编号相同),因为有的人会反复进出X星都城,所以有的编号会被登记多次,但可以确保每一次登记都是真实可靠的。
请你根据这些登记的编号信息判断还有多少疑似间谍者仍然停留在X星都城内。
输入
单组输入。
第1行输入一个正整数N,表示N个被登记的编号。(N<=10^4)
第2行输入N个被登记的编号(字符串类型),两两之间用英文空格隔开,可能会有一些编号重复。
输出
输出疑似间谍者仍然停留在X星都城内的数量。
样例输入 Copy
6
0001 0002 0001 0002 0003 0002
样例输出 Copy
2
代码:

while True:
    n=int(input())
    k=list(input().split())
    s=list(set(k))
     
    count=0
    for i in range(len(s)):
        if k.count(s[i])%2!=0:
             
            count+=1
    print(count)

2086: 奖牌榜

[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
X星学校的运动会正在激烈进行中。
现在需要请你编写一个程序来显示所有班级的奖牌榜,显示规则如下:
(1) 优先按照金牌数量降序排列后显示。
(2) 如果金牌数相等则比较银牌数,银牌数多者显示在前。
(3) 如果金牌和银牌数都相等,则比较铜牌数,铜牌数多者显示在前。
(4) 如果金、银、铜数量均相等,则按照班级编号从小到大排列后显示。
(5) 需要按照班级编号、金牌数、银牌数、铜牌数、奖牌总数的顺序显示每个班级的奖牌情况。
已知X星学校的班级编号为一个四位正整数,且班级编号具有唯一性。

输入
单组输入。
第1行输入一个正整数N,表示班级的总数量,N<=9000。
接下来N行,每1行包含四个正整数,分别表示班级编号、金牌数、银牌数和铜牌数。金牌数、银牌数和铜牌数均小于100。两两之间用英文空格隔开。
输出
显示按照规则排序之后的奖牌榜,每一行都包含班级编号、金牌数、银牌数、铜牌数和奖牌总数,两两之间用英文空格隔开。
样例输入 Copy
4
1000 4 10 5
1001 5 11 6
1002 4 11 4
1003 4 10 5
样例输出 Copy
1001 5 11 6 22
1002 4 11 4 19
1000 4 10 5 19
1003 4 10 5 19
代码:

while True:
    n=int(input())
    s=[]
    for i in range(n):
        s.append(list(map(int,input().split())))
    s.sort(key=lambda x:(x[1],x[2],x[3],-x[0]),reverse=True)
    for i in range(n):
        s[i].append(sum(s[i][1:]))
        for j in range(5):
            if j!=0:
                print(" ",end="")
            print(s[i][j],end="")
        print()

2064: 两个集合

[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
现在有两个分别包含M和N个整数的集合S1和S2。S1中的元素互不相同,S2中的元素也互不相同。
给定一个整数K,然后从S1和S2中各选取一个整数,使得其和等于K。请问一共存在多少种不同的选取方案?
从S1中选取A、从S2中选取B与从S1中选取B、从S2中选取A是两种不同的选取方案。如果一种选取方案都不存在,则输出0。
输入
单组输入。
第1行输入三个整数M、N和K,其中,M和N均不超过10000。
第2行输入M个不同的整数,对应集合S1中的M个元素。
第3行输入N个不同的整数,对应集合S2中的N个元素。
输出
输出不同选取方案的数量;如果一种选取方案都不存在,则输出0。
样例输入 Copy
3 4 0
-1 1 2
-2 1 -1 0
样例输出 Copy
3
代码:

while True:
    m,n,p=map(int,input().split())
    k=list(map(int,input().split()))
    s=list(map(int,input().split()))
    count=0
    for i in range(m):
        if p-k[i] in s:
            count+=1
    print(count)
 

2065: 数字盒子

[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
小米同学设计了一个数字盒子,只允许在该盒子的顶部对数字进行操作,操作类型包括以下三类:
(1) Add操作:如果盒子顶部有数字,则将数字加1;如果没有数字,则该操作无效。
(2) Push操作:将一个新的数字增加到盒子顶部,新增数字的初始值均为1(盒子可以装下所有的数字)。
(3) Pop操作:删除数字盒子顶部的数字;如果没有数字,则该操作无效。
请问通过N次操作之后,盒子顶部的数字是多少?如果最后盒子的顶部已经没有数字,则输出“No number.”。
输入
单组输入。
第1行输入一个正整数N(N<=1000)表示操作的总数量。
接下来N行每行包含一个操作指令,操作指令包括三类,分别是:Add、Push和Pop。
输出
输出通过N个操作之后盒子顶部的数字;如果最后盒子的顶部已经没有数字,则输出“No number.”。
样例输入 Copy
6
Push
Add
Pop
Push
Add
Add
样例输出 Copy
3

while True:
    n=int(input().strip())
    s=[]
    for i in range(n):
        p=input().strip()
        if p=='Push':
            s.append(1)
        if p=='Add':
            if len(s)!=0:
                s[-1]+=1
        if p=='Pop':
            if len(s)!=0:
                s.pop()
 
    if len(s)==0:
        print('No number.')
    else:
        print(s[-1])

2066: 幸运数

[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
小米爸爸的生日是6月17日,因此他特别喜欢“6”和“17”这两个数字,而且他觉得所有包含“6”和“17”的数字都是他的幸运数。当然“17”中的“1”和“7”必须连在一起才行。
现在输入两个正整数M和N,1<=M<N<=999999,请问在M和N之间有多少个满足要求的幸运数?
输入
单组输入。
输入两个正整数M和N,满足1<=M<N<=999999。
两个正整数之间用英文空格隔开。
输出
输出在M和N之间满足要求的幸运数的个数。
样例输入 Copy
1 20
样例输出 Copy
3

while True:
    a,b=map(int,input().split())
    count=0
    for i in range(a,b+1):
        if "6" in str(i) or "17" in str(i):
                count+=1
    print(count)
                 

2067: 十六进制

[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
小米同学最近在学习进制转换。众所周知,在表示十六进制数时,除了0-9这九个阿拉伯数字外,还引入了“A”、“B”、“C”、“D”、“E”和“F”这六个英文字母(不区分大小写)。
现在给你一个十进制正整数,请问在将其转换为十六进制之后,对应的十六进制表示中有多少位是字母?
输入
单组输入。
输入一个十进制正整数N(N<=10^6)。
输出
输出将N转换成十六进制数字后所包含的字母位的数量,如果没有字母位则输出0。
样例输入 Copy
20
样例输出 Copy
0
代码:

while True:
    n=int(input())
    count=0
    while n!=0:
        if n%16>=10:
            count+=1
        n=n//16
    print(count)

2006: 低碳出行

[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
为了做一项关于“爱护环境,从小做起”的公益调查,新司机小明决定开老爸的车从家中前往X市第一小学。从小明家到X市第一小学的交通网络图一共有n个顶点(包括起点小明家和终点X市第一小学)和m条无向边。每条边都有一个碳排放量和一个行驶时间(单位:分钟)。
现在需要你编写一个程序帮助小明实现低碳出行,即寻找一条碳排放量最少的路径,一条路径的碳排放量等于该路径上所有边的碳排放量之和。如果存在两条碳排放量相同的路径,则找出总的行驶时间最少的路径,并输出该路径的总碳排放量和总的时间(分钟)。
输入
单组输入。
在每组输入中,第1行包含两个正整数n和m,分别表示顶点数和边数(n<=1000且m<=1000)。其中,第1号顶点为起点(小明家),第n号顶点为终点(X市第一小学)。两个正整数之间用空格隔开。
第2行到第m+1行表示m条边的信息,每一行包含四个正整数。第1个正整数和第2个正整数表示一条边所对应的两个顶点的编号,第3个正整数表示该边对应的碳排放量,第4个正整数表示该边所对应的行驶时间(单位:分钟)。四个正整数两两之间用空格隔开。
输出
对于每组输入,输出碳排放量最少的路径的总碳排放量和总时间(分钟),如果存在两条碳排放量相同的路径,则输出总的行驶时间最少的路径的总碳排放量和总时间。
样例输入 Copy
3 3
1 2 5 5
1 3 8 11
2 3 3 5
样例输出 Copy
8 10
代码:
这里采用FLOYD算法运算错误,后续采用迪杰斯特拉算法试试

while True:
    n, m = map(int, input().split())
    s = [[float('inf') for i in range(n)] for j in range(n)]
    time = [[float('inf') for i in range(n)] for j in range(n)]
    for i in range(m):
        w = input().strip()
        x, y, f, t = map(int, w.split())
        s[x - 1][y - 1] = f
        time[x - 1][y - 1] = t
    time[0][0] = 0
    s[0][0] = 0
    for k in range(n):
        for i in range(n):
            for j in range(n):
                if s[i][j] < float('inf') and s[i][k] + s[k][j] <= s[i][j]:
                    if time[i][j] < float('inf') and time[i][k] + time[k][j] < time[i][j]:
                        s[i][j] = s[i][k] + s[k][j]
                        time[i][j] = time[i][k] + time[k][j]
    print(s[0][n - 1], time[0][n - 1])

2063: 小米的二叉树

[命题人 : admin]
时间限制 : 1.000 sec 内存限制 : 128 MB

题目描述
小米同学这段时间在学习数据结构中的二叉树。
一天,他遇到一个这样的问题:
有一棵满二叉树,从根结点开始每一个结点都拥有一个编号,根结点的编号是1,其左子结点编号为2,右子结点编号为3,以此类推,从上至下、从左至右逐个按顺序为结点编号。
现在为每个结点再增加一个正整数权重值,然后输入一个查询结点的编号,计算以该结点作为根结点的左子树所有结点和右子树所有结点的权重和。如果左子树的权重和大于右子树的权重和,输出“L”,如果右子树的权重和大于左子树的权重和,输出“R”,如果左、右子树的权重和相等,则输出“E”。如果待查询结点是叶子结点也输出“E"。
请编写一个程序实现上述功能。
输入
第1行输入二叉树的总结点个数N,总结点的数量N不超过1000。
第2行输入二叉树上N个结点中每一个结点的权重值,两个权重值之间用英文空格隔开,按照从上至下,从左至右的顺序依次给出每个结点的权重值。
第3行输入待查询结点的编号(输入的编号<=N)。
输入数据保证满足满二叉树的要求。
输出
按照题目要求输出指定的字符。以输入的待查询结点为根结点,如果左子树的权重和大于右子树的权重和,输出“L”,如果右子树的权重和大于左子树的权重和,输出“R”,如果左、右子树的权重和相等,则输出“E”。如果待查询结点是叶子结点也输出“E"。
样例输入 Copy
7
1 2 3 3 2 5 1
3
样例输出 Copy
L
代码:

def find1(n1):
    global l
    l +=f[n1]
    if 2 * n1 > n:
        return 0
    find1(n1 * 2)
def find2(n1):
    global r
    r +=f[n1]
    if n1*2+1>n:
        return 0
    find2(n1 * 2 + 1)
while True:
    f = [0 for i in range(1010)]
    n = int(input())
    p = list(map(int, input().split()))
    l = 0
    r = 0
    for i in range(1, n + 1):
        f[i] = p[i - 1]
    ch = int(input())
    find1(ch)
    find2(ch)
    flag=l-r
    # print(flag)
    if flag == 0:
        print('E')
    if flag >0:
        print('L')
    if flag <0:
        print('R')
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会敲代码的破茧

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

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

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

打赏作者

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

抵扣说明:

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

余额充值