0
点赞
收藏
分享

微信扫一扫

蓝桥杯训练营结营考核

芷兮离离 2022-01-24 阅读 35

 

 

#这是要看1到2020一共有几个数字2
#可以使用for循环来做,并判断2是否包含在数字中。
m=0
for i in range(1,2021):
    a=list(str(i))
    for j in range(0,len(a)):
        if a[j]=="2":
            m=m+1
print(m)
    
#624

 

#从一个矩阵中提取2020,考虑同行,同列和左上到右下的对角线。
'''[i][j]分别代表行和列。1.i相同 2.j相同 i,j in range(1,n+1) 
3.[i+3][j+3],[i+2][j+2],
[i+1][j+1],[i][j]分别表示0202. i,j in range(1,n-2)'''
def check_s(s):     #要重复查找2020,判断s是不是目标字符串
    return s == "2020"

data = []         #存放判断矩阵

with open("4.11_2020.txt","r",encoding = "utf-8") as fp:     
    for line in fp:      # 逐行读取
        line = list(line.strip())    #strip()中无参数,默认删除左右的空格,即只提取每行的字符\
#(不包括空格),并将一个一个的字符存入列表中 
        data.append(line)  # 以行的形式将"02字符串"填满矩阵

m,n = len(data),len(data[0])    # m--行数,n--列数
count = 0                               # 计数

for i in range(m):        #遍历行
    for j in range(n):     #遍历列
        if i + 3 < n and check_s(data[i][j] + data[i +1][j] + data[i + 2][j] + data[i + 3][j]):
            count += 1      # 寻找自上而下的2020
        if j + 3 < m and check_s(data[i][j] + data[i][j + 1] + data[i][j + 2] + data[i][j + 3]):
            count += 1      #寻找自左而右的2020
        if j + 3 < m and i+3 < n and check_s(data[i][j] + data[i + 1][j + 1] + data[i + 2][j + 2] + data[i + 3][j + 3]):
            count += 1      #寻找自左上到右下的2020
print(count)

                        

 

#每天要跑1km。如果碰到周一与月初,再加1km。
#首先计算每一个月月初,一年12个月。共21年和9个月。
#判断所有周一中有哪个是月初。
'''或者先计算所有周一。所有日子除于7取整。之后算一下哪个月初是周一并减去它们。
一共261个月。一共7945天.'''
#如果天数除于7余3就说明是周一
import datetime
start = datetime.date(2000,1,1)
end = datetime.date(2020,10,1)
days = datetime.timedelta(days=1)  # 用以可用于计算的一天  timedelta代表两个时间之间的时间差
a= 0
while start <= end:
    if start.day == 1 or start.weekday() == 0:
        a += 2
    else:
        a += 1
    start += days
print(a)


#8879

 

#观察发现,所要求的数据中,构成4n+1等差数列求和的关系,则值为2n^2-2n+1
def f(n):
    return 2*(n**2)-2*n+1
print(f(20))
#761

 这道题挺难的,用了java来写

public class Main{
	static int counts=0;
	public static void main(String[] args) {
		int[]str=new int[] {9,14,13,12,11,10,8,7,6,5,4,3,2,1,0};
		//System.out.println(sort2(str));
		StringBuilder sb = new StringBuilder();
		for(int i:str)sb.append((char)(i+'a'));
		System.out.println(sb);
	}
	static int sort2(int []arr) {
		int temp=0;//临时变量
		int res=0;
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1-i; j++) {
                //如果前面的数比后面的数大,则交换
                if(arr[j]>arr[j+1]){
                	res++;
                    temp=arr[j+1];
                    arr[j+1]=arr[j];
                    arr[j]=temp;
                }
            }
        }
        return res;
	}
}

 

#成绩统计
'''首先分数在0到100之间,只大于60是及格,大于85优秀。
会有1列数据输入,要得到及格率和优秀率,百分号前部分四舍五入保留
整数。'''
a=int(input())
b=0
c=0
for e in range(a):
    i=int(input())
    if i>=60:
        b+=1
        if i>=85:
            c+=1
m=format(b/a,'.2f')
n=format(c/a,'.2f')
print(f'{m[2:]}%')
print(f'{n[2:]}%')

 

 

#要找出出现次数最多的字母,且次数相同时要求字典序要小
#会输入一个单词
a=input()
b=sorted(list(set(a)))#变为一个新的列表
max_word = None
max_count = 0
for i in b:
    if max_count < a.count(i):
        max_word = i
        max_count = a.count(i)#利用count函数来计算出现次数
print(max_word)
print(max_count)

 

 

'''路径上的每一步只能从一个数走到下一层和它最近的左边的那
个数或者右边的那个数.此外,向左下走的次数与向右下走的次数
相差不能超过 1。'''
#使用动态规划
# 符合要求的最后的数应该是最后一行的中间的数
a= int(input())
b = []
for i in range(a):
    b.append(list(map(int, input().split())))#添加数据

for i in range(a):
    for j in range(i):
        b[i][j] += max(b[i - 1][j - 1], b[i - 1][j])
if a% 2 == 1:
    print(b[a - 1][a // 2])
else:
    print(max(b[a - 1][a // 2 - 1], b[a - 1][a // 2]))

 

#要 求平面中直线将平面划分为几个部分
'''画图测试(每种情况都考虑,平行、相交):不论什么情况
每增加一条直线都会增加一个平面,每次增加直线时与已存在直线
进行比较,当有n个交点也即与n条直线相交时,相应的平面数量也增加n'''
m = int(input())#接受输入的数据
n = []  # 表示直线的列表
c = 0  #代表交点个数
for _ in range(m):
    a, b = map(int, input().split())
    if [a, b] in n:  # 重复线去掉
        continue
    n.append([a, b])
    d = []  # 每条线与之前所有线的交点
    for i in range(len(n) - 1):
    	if li[i][0] - li[len(n) - 1][0] == 0:
    		continue
        x = (n[len(n) - 1][1] - n[i][1]) /(n[i][0] - n[len(n) - 1][0])
        y = x * li[i][0] + li[i][1]
        if [x, y] in d:  # 保存不同的交点
            continue
        d.append([x, y])
    c += len(d)


print(len(n) + c + 1)

 

 

 最后一个不会,呵呵。

def eliminate(bead, max_dic):  # 对用不到的价值剔除,同时对bead进行更新
    for i in bead:
        if i[1] > max_dic[i[0]]:
            for _ in range(i[1] - max_dic[i[0]]):
                i.pop()
                i[1] -= 1
    if len(bead[-1]) == 2:  # 此时本类装饰珠价值不被用到,剔除
        res = bead.pop()[0]
        del dic[res]
        del max_dic[res]
    # print(bead)


N = []
for i in range(6):
    N.append(list(map(int, input().split())))
dic = {}  # 用来存储装饰孔各等级的数量
max_dic = {}  # 存储每个装饰孔各等级可以放置装饰珠的最大个数
for i in N:
    for j in i[1:]:
        if j in dic:
            dic[j] += 1
            max_dic[j] += 1
        else:
            dic[j] = 1
            max_dic[j] = 1
# print(dic)

for i in range(max(dic) - 1, 0, -1):
    if i not in max_dic:
        max_dic[i] = max_dic[i + 1]
    max_dic[i] += max_dic[i + 1]
# print(max_dic)

M = int(input())
bead = []
for i in range(M):
    bead.append(list(map(int, input().split())))
eliminate(bead, max_dic)  # 对用不到的价值剔除

count = 0
while count != max_dic[1] + 2 * len(bead):
    te = None
    tmp = 0
    for i in range(len(bead) - 1, -1, -1):  # 找出等级拉满收益最大的等级,再次进行剔除
        if len(bead[i]) == 3:
            if tmp < bead[i][-1]:  # 找出价值跨越最大的地方,这里的技能一定是点满的
                te = i
                tmp = bead[i][-1]
                continue
        if tmp < bead[i][-1] - bead[i][-2]:  # 找出价值跨越最大的地方,这里的技能一定是点满的
            te = i
            tmp = bead[i][-1] - bead[i][-2]
    # print(dic)
    # print(max_dic)
    if max_dic[bead[te][0]] > dic[bead[te][0]] and bead[te][0] != max(dic):
        max_dic[bead[te][0] + 1] -= max_dic[bead[te][0]] - dic[bead[te][0]]
        for i in range(max_dic[bead[te][0]] - dic[bead[te][0]]):
            bead[bead[te][0]].pop()
    if len(bead[-1]) == 2:  # 此时本类装饰珠价值不被用到,剔除
        res = bead.pop()[0]
        del dic[res]
        del max_dic[res]
    # print(bead)
    Sum = 0
    for i in bead[::-1]:
        if Sum + i[1] <= max_dic[i[0]]:
            Sum += i[1]
        else:
            Sum += i[1]
            for j in range(Sum - max_dic[i[0]]):
                Sum -= 1
                i.pop()
                i[1] -= 1
    count = 0
    for i in range(len(bead)):
        count += len(bead[i])
    if count < max_dic[1] + 2 * len(bead):
        break

Num = 0
for i in bead:
    Num += i[-1]
print(Num)

 

举报

相关推荐

0 条评论