第十一届蓝桥杯大赛第二场省赛试题
3.
这道题一看就是考察日期的使用,首先需要生成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.
这个题目找规律难一点,但是因为只要找对角线上的答案就还挺简单的,可以看到对角线上分别是1->5->13->25,分别像相差4,8,12,用模拟或者求规律都可以
cha =4
start=1
for i in range(19):
start+=cha
cha+=4
print(start)
答案:761
5.
这道题我准备用排序来得到,但是程序太大了,不知道各位大佬都怎么做出来的求教
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.
对于这种需要进行多次排序的,可以将其变成一个二维列表,这样排序就可以多个排序了,自带的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.
这个使用动态规划就能全部实现,首先使用的是从后往前遍历的程序,但后面发现从后往前不能满足条件:向左下走的次数与向右下走的次数相差不能超过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.平面划分
这道题可以使用模拟的方法,主要是要考虑新加的直线与原有直线的关系,遍历新增的直线与已有直线之间的关系,主要根据新增直线与已有直线的交点个数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) #输出子平面个数