第十一届蓝桥杯大赛第二场省赛试题

124 阅读4分钟

第十一届蓝桥杯大赛第二场省赛试题

3.image-20210223225307896

这道题一看就是考察日期的使用,首先需要生成2000年1月1日到2020年10月1日的日期,因为不能使用pandas库,本来可以生成一个时间序列,于是使用datatime库的起始位置和差值进行循环直到最后一天推出循环

生成起始时间和结束时间

import datetime
#生成时间序列
startday = datetime.datetime(year = 2000,month=1,day=1)
endday = datetime.datetime(year = 2020,month=10,day=1)

至于星期几的判断可以使用weekday()获得,

if(temp.day==1 or temp.weekday()==1):

接下来是完整代码:

import datetime
#生成时间序列
startday = datetime.datetime(year = 2000,month=1,day=1)
endday = datetime.datetime(year = 2020,month=10,day=1)
​
time_list = []
sumvalue=0
​
for i in range(10000):
    cha = datetime.timedelta(days=i)
    temp = startday+cha
    if(temp.day==1 or temp.weekday()==1):
        sumvalue+=2
        print(temp)
        print("1")
    else:
        sumvalue += 1
​
    if(temp==endday):
        time_list.append(temp)
        break
    time_list.append(temp)
​
print(sumvalue)

答案:8877

4.

image-20210224003517552

这个题目找规律难一点,但是因为只要找对角线上的答案就还挺简单的,可以看到对角线上分别是1->5->13->25,分别像相差4,8,12,用模拟或者求规律都可以

cha =4
start=1
for i in range(19):
    start+=cha
    cha+=4
print(start)

答案:761

5.image-20210224004115336

这道题我准备用排序来得到,但是程序太大了,不知道各位大佬都怎么做出来的求教

import string
from itertools import permutations
​
alpha = [chr(i) for i in range(97,97+26)]
for i in range(15,100):
    temp = permutations(alpha,i) #使用i个字母
    for j in temp:
        j =list(j)
        print(j)
        sum_value =0
        for k in range(1,len(j)):
            for l in range(0,len(j)-k):
                if(j[l]>j[l+1]):
                    sum_value +=1
                    j[l+1],j[l]=j[l],j[l+1]
        print(sum_value)
        if(sum_value==100):
            print(temp)         #使用了
            break
6.image-20210224022409461

对于这种需要进行多次排序的,可以将其变成一个二维列表,这样排序就可以多个排序了,自带的sort函数就可以实现

a = input()
list1=[]
for i in range(97,97+26):
    if chr(i) in a:
        list1.append([chr(i),a.count(chr(i))])
​
list1.sort()
print(list1[0][0]) 
print(list1[0][1])

7.image-20210224023617825

这个使用动态规划就能全部实现,首先使用的是从后往前遍历的程序,但后面发现从后往前不能满足条件:向左下走的次数与向右下走的次数相差不能超过1

code:

N =int(input())
a = [[0 for i in range(N+1)] for row in range(N+1)]
for i in range(N):
    temp = map(int,input().split())
    temp =list(temp)
    for j in range(len(temp)):
        a[i][j] = temp[j]
for i in range(N-1,-1,-1):
    print(i)
    for j in range(N):
        a[i][j] =a[i][j] + max(a[i+1][j],a[i+1][j+1])
print(a[0][0])

从上往下遍历:

需要分两种情况,当N为奇数时,最大值只能最后走到中间位置,而N为偶数时,可以有两个落点.需要根据情况计算.

N =int(input())
a = [[0 for i in range(N+1)] for row in range(N+1)]
for i in range(N):
    temp = map(int,input().split())
    temp =list(temp)
    for j in range(len(temp)):
        a[i][j] = temp[j]
for i in range(1,N):
    for j in range(N):  #也就是利用了这个东西的
        a[i][j] =a[i][j] + max(a[i-1][j-1],a[i-1][j])
if(N%2==1):
    maxvalue = a[N-1][int((N-1)/2)]
else:
    maxvalue = max(a[N-1][int(N/2)],a[N-1][int(N/2-1)])
print(maxvalue)

8.平面划分

image-20210224182250534

这道题可以使用模拟的方法,主要是要考虑新加的直线与原有直线的关系,遍历新增的直线与已有直线之间的关系,主要根据新增直线与已有直线的交点个数M来计算,分为下面三种情况:

1.新增直线与已有直线平行:与该直线没有相交点,不用求交点.

2.新增直线与已有直线重合:相当于没有变化,停止遍历.将新增子平面变为-1

3.新增直线与已有直线有交点:求出交点位置,利用集合去重.

对原有直线遍历之后得到了交点个数,新增的子平面为M+1,循环N次即可

N = int(input()) #输入N
setpointline = set()
sumvalue =1
for i in range(N):
    seta = set()  #每次都遍历一次
    linex,liney = map(int,input().split())
    for x,y in setpointline:
        if(x==linex and y==liney): #如果重合
            sumvalue-=1  #
            seta=set()  #去掉原有集合种的元素
            break
        elif(x==linex):  #如果斜率相同,没有交点
            continue
        else:
            nodex = (y-liney)/(linex-x) #交点
            nodey = x*nodex + y #代入任意方程
            seta.add((nodex,nodey)) #进入集合
    sumvalue+=len(seta)+1  #也就是加入
    if ((linex, liney) not in setpointline):
        setpointline.add((linex, liney))  # 是不是有重边
print(sumvalue) #输出子平面个数