算法题——洛谷1

P8772 求和

题目描述

给定 n n n 个整数 a 1 , a 2 , ⋯   , a n a_{1}, a_{2}, \cdots, a_{n} a1,a2,,an, 求它们两两相乘再相加的和,即

S = a 1 ⋅ a 2 + a 1 ⋅ a 3 + ⋯ + a 1 ⋅ a n + a 2 ⋅ a 3 + ⋯ + a n − 2 ⋅ a n − 1 + a n − 2 ⋅ a n + a n − 1 ⋅ a n S=a_{1} \cdot a_{2}+a_{1} \cdot a_{3}+\cdots+a_{1} \cdot a_{n}+a_{2} \cdot a_{3}+\cdots+a_{n-2} \cdot a_{n-1}+a_{n-2} \cdot a_{n}+a_{n-1} \cdot a_{n} S=a1a2+a1a3++a1an+a2a3++an2an1+an2an+an1an

输入格式

输入的第一行包含一个整数 n n n

第二行包含 n n n 个整数 a 1 , a 2 , ⋯ a n a_{1}, a_{2}, \cdots a_{n} a1,a2,an

输出格式

输出一个整数 S S S,表示所求的和。请使用合适的数据类型进行运算。

样例 #1

样例输入 #1

4
1 3 6 9

样例输出 #1

117

提示

对于 30 % 30 \% 30% 的数据, 1 ≤ n ≤ 1000 , 1 ≤ a i ≤ 100 1 \leq n \leq 1000,1 \leq a_{i} \leq 100 1n1000,1ai100

对于所有评测用例, 1 ≤ n ≤ 2 × 1 0 5 , 1 ≤ a i ≤ 1000 1 \leq n \leq 2\times10^5,1 \leq a_{i} \leq 1000 1n2×105,1ai1000

蓝桥杯 2022 省赛 A 组 C 题。

题解:

def main():
    n=map(int,input().strip().split())
    a=list(map(int,input().strip().split()))
    presum=[0 for _ in range(len(a))]
    presum[0]=a[0]
    f=0
    length=len(a)
    for i in range(1,len(a)):
        presum[i]=a[i]+presum[i-1]
    for i in range(0,len(a)):
           f+=a[i]*(presum[length-1]-presum[i])
    print(f)
main()

P8781 修建灌木

题目描述

爱丽丝要完成一项修剪灌木的工作。

N N N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌木,让灌木的高度变为 0 0 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。

灌木每天从早上到傍晩会长高 1 1 1 厘米, 而其余时间不会长高。在第一天的早晨, 所有灌木的高度都是 0 0 0 厘米。爱丽丝想知道每棵灌木最高长到多高。

输入格式

一个正整数 N N N ,含义如题面所述。

输出格式

输出 N N N 行, 每行一个整数, 第行表示从左到右第 i i i 棵树最高能长到多高。

样例 #1

样例输入 #1

3

样例输出 #1

4
2
4

提示

对于 30 % 30 \% 30% 的数据, N ≤ 10 N \leq 10 N10.

对于 100 % 100 \% 100% 的数据, 1 < N ≤ 10000 1<N \leq 10000 1<N10000.

蓝桥杯 2022 省赛 B 组 D 题。

def main():
    n=int(input())
    for i in range(1,n+1):
        print(2*max((n-i),i-1))
main()

P8754 完全平方数

题目描述

一个整数 a a a 是一个完全平方数,是指它是某一个整数的平方,即存在一个 整数 b b b,使得 a = b 2 a=b^{2} a=b2

给定一个正整数 n n n,请找到最小的正整数 x x x,使得它们的乘积是一个完全平方数。

输入格式

输入一行包含一个正整数 n n n

输出格式

输出找到的最小的正整数 x x x

样例 #1

样例输入 #1

12

样例输出 #1

3

样例 #2

样例输入 #2

15

样例输出 #2

15

提示

对于 30 % 30 \% 30% 的评测用例, 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1n1000,答案不超过 1000 1000 1000

对于 60 % 60 \% 60% 的评测用例, 1 ≤ n ≤ 1 0 8 1 \leq n \leq 10^{8} 1n108,答案不超过 1 0 8 10^{8} 108

对于所有评测用例, 1 ≤ n ≤ 1 0 12 1 \leq n \leq 10^{12} 1n1012,答案不超过 1 0 12 10^{12} 1012

蓝桥杯 2021 第二轮省赛 A 组 G 题(B 组 H 题)。

题解:

from math import *

n = int(input())
i = isqrt(n)
while i > 1:
    if n % (i ** 2) == 0:
        n //= (i ** 2)
        i = isqrt(n)
    i -= 1
print(n)

P8748 时间显示

题目描述

小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。

现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要 显示出时分秒即可,毫秒也不用显示,直接舍去即可。

给定一个用整数表示的时间,请将这个时间对应的时分秒输出。

输入格式

输入一行包含一个整数,表示时间。

输出格式

输出时分秒表示的当前时间, 格式形如 H H : M M : S S \mathrm{HH}: \mathrm{MM}: \mathrm{SS} HH:MM:SS, 其中 H H \mathrm{HH} HH 表示时, 值 为 0 0 0 23 , M M 23, \mathrm{MM} 23,MM 表示分。值为 0 0 0 59 59 59 S S \mathrm{SS} SS 表示秒, 值为 0 0 0 59 59 59。时、分、秒不足两位时补前导 0

样例 #1

样例输入 #1

46800999

样例输出 #1

13:00:00

样例 #2

样例输入 #2

1618708103123

样例输出 #2

01:08:23

提示

对于所有评测用例, 给定的时间为不超过 1 0 18 10^{18} 1018 的正整数。

蓝桥杯 2021 第一轮省赛 B 组 F 题。

题解:


def main():
    n=int(input())
    second_remian=n/1000#今天的毫秒数转换为今天的秒数
    hour=second_remian//3600#得到今天的小时数
    hour%=24#限制到0-23
    min_remain=second_remian%3600#得到除去小时后剩余的分钟数
    min=min_remain//60#得到今天的分钟数,范围0-59
    second_remian=min_remain%60#得到除去小时和分钟后的剩余秒数
    second=second_remian#得到今天的秒数
    print("{:0>2d}".format(int(hour)),end=":")
    print("{:0>2d}".format(int(min)),end=":")
    print("{:0>2d}".format(int(second)))

main()

P8742 砝码称重

题目描述

你有一架天平和 N N N 个砝码, 这 N N N 个砝码重量依次是 W 1 , W 2 , ⋯   , W N W_{1}, W_{2}, \cdots, W_{N} W1,W2,,WN 。 请你计算一共可以称出多少种不同的重量?

注意砝码可以放在天平两边。

输入格式

输入的第一行包含一个整数 N N N

第二行包含 N N N 个整数: W 1 , W 2 , W 3 , ⋯   , W N W_{1}, W_{2}, W_{3}, \cdots, W_{N} W1,W2,W3,,WN

输出格式

输出一个整数代表答案。

样例 #1

样例输入 #1

3
1 4 6

样例输出 #1

10

提示

【样例说明】

能称出的 10 种重量是: 1 、 2 、 3 、 4 、 5 、 6 、 7 、 9 、 10 、 11 1 、 2 、 3 、 4 、 5 、 6 、 7 、 9 、 10 、 11 123456791011

1 = 1 2 = 6 − 4 (  天平一边放  6 ,  另一边放 4)  3 = 4 − 1 4 = 4 5 = 6 − 1 6 = 6 7 = 1 + 6 9 = 4 + 6 − 1 10 = 4 + 6 11 = 1 + 4 + 6 \begin{aligned} &1=1 \\ &2=6-4(\text { 天平一边放 } 6, \text { 另一边放 4) } \\ &3=4-1 \\ &4=4 \\ &5=6-1 \\ &6=6 \\ &7=1+6 \\ &9=4+6-1 \\ &10=4+6 \\ &11=1+4+6 \end{aligned} 1=12=64( 天平一边放 6, 另一边放 4) 3=414=45=616=67=1+69=4+6110=4+611=1+4+6

【评测用例规模与约定】

对于 50 % 50 \% 50% 的评测用例, 1 ≤ N ≤ 15 1 \leq N \leq 15 1N15

对于所有评测用例, 1 ≤ N ≤ 100 , N 1 \leq N \leq 100, N 1N100,N 个砝码总重不超过 1 0 5 10^5 105

蓝桥杯 2021 第一轮省赛 A 组 F 题(B 组 G 题)。


def main():
    N = int(input())
    weight = list(map(int, input().split()))
    ans = set()
    for i in weight:
        if len(ans) == 0:
            ans.add(i)
            continue
        ans_list = list(ans)
        for j in ans_list:
            ans.add(i+j)
            ans.add(abs(i-j))
        ans.add(i)
    if 0 in ans:
        ans.remove(0)
    print(len(ans))
main()

P8780 刷题统计

题目描述

小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a a a 道题目,周六和周日每天做 b b b 道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于 n n n 题?

输入格式

输入一行包含三个整数 a , b a, b a,b n n n.

输出格式

输出一个整数代表天数。

样例 #1

样例输入 #1

10 20 99

样例输出 #1

8

提示

对于 50 % 50 \% 50% 的评测用例, 1 ≤ a , b , n ≤ 1 0 6 1 \leq a, b, n \leq 10^{6} 1a,b,n106.

对于 100 % 100 \% 100% 的评测用例, 1 ≤ a , b , n ≤ 1 0 18 1 \leq a, b, n \leq 10^{18} 1a,b,n1018.

蓝桥杯 2022 省赛 B 组 C 题。


def main():
    a,b,n = list(map(int, input().split()))
    total=0
    list1=[a for _ in range(5) ]
    list2=[b for _ in range(2) ]
    slist=list1+list2
    i=0
    sum=0
    ans=0
    while sum<n:
        if  i<7:
            sum+=slist[i]
            ans+=1
            i += 1
        else:
            i=0
    print(ans)
main()

P8753 小平方

题目描述

小蓝发现,对于一个正整数 n n n 和一个小于 n n n 的正整数 v v v,将 v v v 平方后对 n n n 取余可能小于 n n n 的一半,也可能大于等于 n n n 的一半。

请问,在 1 1 1 n − 1 n-1 n1 中, 有多少个数平方后除以 n n n 的余数小于 n n n 的一半。

例如,当 n = 4 n=4 n=4 时, 1 , 2 , 3 1,2,3 1,2,3 的平方除以 4 4 4 的余数都小于 4 4 4 的一半。

又如,当 n = 5 n=5 n=5 时, 1 1 1 4 4 4 的平方除以 5 5 5 的余数都是 1 1 1,小于 5 5 5 的一半。而 2 2 2 3 3 3 的平方除以 5 5 5 的余数都是 4 4 4, 大于等于 5 5 5 的一半。

输入格式

输入一行包含一个整数 n n n

输出格式

输出一个整数,表示满足条件的数的数量。

样例 #1

样例输入 #1

5

样例输出 #1

2

提示

对于所有评测用例, 1 ≤ n ≤ 10000 1 \leq n \leq 10000 1n10000

蓝桥杯 2021 第二轮省赛 A 组 F 题(B 组 G 题)。

def main():
    n = int(input())
    ans=set()
    for i in range(1,n):
        mod=  (i ** 2)%n
        if mod*2<n:
            ans.add(i)
    print(len(ans))
main()

P8752 特殊年份

题目描述

今年是 2021 年,2021 这个数字非常特殊, 它的千位和十位相等, 个位比百位大 1 1 1,我们称满足这样条件的年份为特殊年份。

输入 5 5 5 个年份,请计算这里面有多少个特殊年份。

输入格式

输入 5 5 5 行,每行一个 4 4 4 位十进制数(数值范围为 1000 1000 1000 9999 9999 9999),表示一个年份。

输出格式

输出一个整数,表示输入的 5 5 5 个年份中有多少个特殊年份。

样例 #1

样例输入 #1

2019
2021
1920
2120
9899

样例输出 #1

2

提示

【样例说明】

2021 和 9899 是特殊年份,其它不是特殊年份。

蓝桥杯 2021 第二轮省赛 B 组 F 题。


def main():
    list1=[]
    for i in range(5):
         list1.append(int(input()))
    ans=set()
    for ele in list1:
        qian=ele//1000
        bai=(ele//100)%10
        shi=((ele//10)%100)%10
        ge=(((ele%1000)%100)%10)
        if qian==shi and ge-bai==1:
            ans.add(ele)
    print(len(ans))
main()

P8680 特别数的和

题目描述

小明对数位中含有 2 2 2 0 0 0 1 1 1 9 9 9 的数字很感兴趣(不包括前导 0 0 0),在 1 1 1 40 40 40 中这样的数包括 1 1 1 2 2 2 9 9 9 10 10 10 32 32 32 39 39 39 40 40 40,共 28 28 28 个,他们的和是 574 574 574

请问,在 1 1 1 n n n 中,所有这样的数的和是多少?

输入格式

输入一行包含一个整数 n n n

输出格式

输出一行,包含一个整数,表示满足条件的数的和。

样例 #1

样例输入 #1

40

样例输出 #1

574

提示

对于 20 % 20\% 20% 的评测用例, 1 ≤ n ≤ 10 1 \le n \le 10 1n10

对于 50 % 50\% 50% 的评测用例, 1 ≤ n ≤ 100 1 \le n \le 100 1n100

对于 80 % 80\% 80% 的评测用例, 1 ≤ n ≤ 1000 1 \le n \le 1000 1n1000

对于所有评测用例, 1 ≤ n ≤ 10000 1 \le n \le 10000 1n10000

蓝桥杯 2019 省赛 B 组 F 题。

def main():
    n=int(input())
    ans=0
    for i in range(1,n+1):
        temp=i
        while temp!=0:
            if  temp % 10 == 2 or temp % 10 == 0 or temp % 10 == 1 or temp % 10 == 9:
                ans+=i
                break
            else:
                temp//=10
    print(ans)
main()

P8598 错误票据

题目背景

某涉密单位下发了某种票据,并要在年终全部收回。

题目描述

每张票据有唯一的 ID 号,全年所有票据的 ID 号是连续的,但 ID 的开始数码是随机选定的。因为工作人员疏忽,在录入 ID 号的时候发生了一处错误,造成了某个 ID 断号,另外一个 ID 重号。

你的任务是通过编程,找出断号的 ID 和重号的 ID。

数据保证断号不可能发生在最大和最小号。

输入格式

一个整数 N ( N < 100 ) N(N<100) N(N<100) 表示后面数据行数,接着读入 N N N 行数据,每行数据长度不等,是用空格分开的若干个(不大于 100 100 100 个)正整数(不大于 1 0 5 10^5 105),每个整数代表一个 ID 号。

输出格式

要求程序首先输入要求程序输出 1 1 1 行,含两个整数 m m m n n n,用空格分隔,其中, m m m 表示断号 ID, n n n 表示重号 ID。

样例 #1

样例输入 #1

2
5 6 8 11 9
10 12 9

样例输出 #1

7 9

样例 #2

样例输入 #2

6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119

样例输出 #2

105 120
def main():
    n = int(input())
    list1 = []
    union = set()
    ans2 = []
    max1, min1 = 0, 100000
    for i in range(n):
        list1.append(list(map(int, input().strip().split())))
        max1 = max(max(list1[i]), max1)
        min1 = min(min(list1[i]), min1)
    for i in range(n):
        set1 = set(list1[i])
        ans2 += list(union.intersection(set1))
        union = union.union(set1)
    ans1 = 0

    for e in range(min1, max1):
        if e not in union:
            ans1 = e
            
 
    print(ans1, ans2[0])
    

main()


P8706 解码

题目描述

小明有一串很长的英文字母,可能包含大写和小写。

在这串字母中,有很多连续的是重复的。小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母 + 出现次数的形式。 例如,连续的 5 5 5a,即 aaaaa,小明可以简写成 a5(也可能简写成 a4aaa3a 等)。

对于这个例子:HHHellllloo,小明可以简写成 H3el5o2。为了方便表达,小明不会将连续的超过9个相同的字符写成简写的形式。

现在给出简写后的字符串,请帮助小明还原成原来的串。

输入格式

输入一行包含一个字符串。

输出格式

输出一个字符串,表示还原后的串。

样例 #1

样例输入 #1

H3el5o2

样例输出 #1

HHHellllloo

提示

对于所有评测用例,字符串由大小写英文字母和数字组成,长度不超过 100 100 100。请注意原来的串长度可能超过 100 100 100

蓝桥杯 2020 第一轮省赛 A 组 F 题(B 组 G 题)。

def main():
    set1={'1','2','3','4','5','6','7','8','9'}
    str=list(input())
    new_str=str
    for i in range(len(str)-1,-1,-1):
        if str[i] in set1:
            num=int(str[i])-1
            str.pop(i)
            for j in range(num):
                str.insert(i-1,str[i-1])
    for e in str:
        print(e,end="")

main()

P8711 整除序列

题目描述

有一个序列,序列的第一个数是 n n n,后面的每个数是前一个数整除 2 2 2,请输出这个序列中值为正数的项。

输入格式

输入一行包含一个整数 n n n

输出格式

输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。

样例 #1

样例输入 #1

20

样例输出 #1

20 10 5 2 1

提示

对于 80 % 80\% 80% 的评测用例, 1 ≤ n ≤ 1 0 9 1\le n\le10^9 1n109

对于所有评测用例, 1 ≤ n ≤ 1 0 18 1\le n\le10^{18} 1n1018

蓝桥杯 2020 第一轮省赛 B 组 F 题。

def main():
    n=int(input())
    list1=[]
    while n>0:
        list1.append(n)
        n//=2
    for e in list1:
        print(e,end=" ")

main()

P8717 成绩分析

题目描述

小蓝给学生们组织了一场考试,卷面总分为 100 100 100 分,每个学生的得分都是一个 0 0 0 100 100 100 的整数。

请计算这次考试的最高分、最低分和平均分。

输入格式

输入的第一行包含一个整数 n n n,表示考试人数。

接下来 n n n 行,每行包含一个 0 0 0 100 100 100 的整数,表示一个学生的得分。

输出格式

输出三行。

第一行包含一个整数,表示最高分。

第二行包含一个整数,表示最低分。

第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。

样例 #1

样例输入 #1

7
80
92
56
74
88
99
10

样例输出 #1

99
10
71.29

提示

对于 50 % 50 \% 50% 的评测用例, 1 ≤ n ≤ 100 1 \leq n \leq 100 1n100

对于所有评测用例, 1 ≤ n ≤ 10000 1 \leq n \leq 10000 1n10000

蓝桥杯 2020 第二轮省赛 A 组 F 题(B 组 F 题)。

def main():
    n=int(input())
    score=[]
    sum=0
    for _ in range(n):
        e=int(input())
        score.append(e)
        sum+=e
    print(max(score))
    print(min(score))
    print(round(sum/len(score),2))

main()

P8722 日期识别

题目描述

小蓝要处理非常多的数据, 其中有一些数据是日期。

在小蓝处理的日期中有两种常用的形式:英文形式和数字形式。

英文形式采用每个月的英文的前三个字母作为月份标识,后面跟两位数字表示日期,月份标识第一个字母大写,后两个字母小写, 日期小于 10 10 10 时要补前导 0 0 0 1 1 1 月到 12 12 12 月英文的前三个字母分别是 JanFebMarAprMayJunJulAugSepOctNovDec

数字形式直接用两个整数表达,中间用一个空格分隔,两个整数都不写前 导 0。其中月份用 1 1 1 12 12 12 分别表示 1 1 1 月到 12 12 12 月。

输入一个日期的英文形式, 请输出它的数字形式。

输入格式

输入一个日期的英文形式。

输出格式

输出一行包含两个整数,分别表示日期的月和日。

样例 #1

样例输入 #1

Feb08

样例输出 #1

2 8

样例 #2

样例输入 #2

Oct18

样例输出 #2

10 18

提示

蓝桥杯 2020 第三轮省赛 AB 组 F 题。

def main():
    list1=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
    str=input()
    yue1=str[0:3]
    ri1=list(map(int,str[3:]))
    yue2=list1.index(yue1)+1
    ri2=ri1[0]*10+ri1[1]
    print(yue2,ri2)

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值