第一题我就用贪心暴力做的,感觉挺菜的做法,最开始AC了27%,后来就多加了一个day_loss变量(原本每个循环都是sum_loss+=d*a[i]),先做加法再做乘法,突然全AC了。。🤣有一些改进吧,但是全AC不知道是我改进的原因还是赛码的原因。
第二题不会做😅,希望有大佬可以分享一下解题方法。
第一题
#最近经济不景气,小A准备将持仓的股票抛售一部分,他共持有n支股票,受交易平台的限制,他每天最多只能卖出m支股票,已知第i支股票每天会亏损a_i元,即如果第k天抛售这支股票,亏损的数额是k*a_i元。
#
#现在他还没有决定具体卖出多少支股票,所以他会给你若干个询问,即如果卖出q支股票,这q支股票最少的亏损数额是多少元。
#
#输入
#输入第一行包含两个正整数n和m,表示小A持仓的股票数量和每天最多能卖出的股票数量。(1<=n,m<=50000)
#输入第二行包含n个正整数,第i个数a_i表示第i支股票每天的亏损数额。(1<=a_i<=10000)
#接下来一行有一个正整数Q,表示询问的数量。(1<=Q<=50000)
#之后有Q行,每行有一个正整数q,表示假如要卖出q支股票,最少的亏损数额是多少元。(q<=n)
#
#现在他还没有决定具体卖出多少支股票,所以他会给你若干个询问,即如果卖出q支股票,这q支股票最少的亏损数额是多少元。
#
#输入
#输入第一行包含两个正整数n和m,表示小A持仓的股票数量和每天最多能卖出的股票数量。(1<=n,m<=50000)
#输入第二行包含n个正整数,第i个数a_i表示第i支股票每天的亏损数额。(1<=a_i<=10000)
#接下来一行有一个正整数Q,表示询问的数量。(1<=Q<=50000)
#之后有Q行,每行有一个正整数q,表示假如要卖出q支股票,最少的亏损数额是多少元。(q<=n)
#样例输入
#5 2
#1 2 3 4 5
#2
#3
#5
#样例输出
#7
#22
#
#提示
#样例解释:
#一共有5支股票,每天最多可以抛售2支
#q为2,即有两个询问
#针对第一个询问3,需要抛售3支股票,当选择第1、2、3号股票时损失最小。其中第一天抛售2、3号股票,损失为5元;第二天抛售1号股票,损失为2*1=2元;最后合计损失为7元。
#针对第二个询问5,需要抛售第1、2、3、4、5号股票。其中第一天抛售4、5号股票,损失为9元;第二天抛售2、3号股票,损失为2*2+2*3=10;第三天抛售1号股票,损失为3*1=3元;最后合计损失22元。
import math n, m = map(int, input().split()) a = list(map(int, input().split())) a.sort(reverse=True) p = int(input()) for pi in range(p): q = int(input()) max_day = math.ceil(q/m) sum_loss = 0 i = n - q for d in range(1, max_day): day_loss = 0 for mi in range(m): day_loss += a[i] i += 1 sum_loss += day_loss*d for mi in range(q - m*d): sum_loss += max_day * a[i] print(sum_loss)
第二题
#一共有n个格子从左到右排成了一行,从1~n编号。第 i 个格子上写着一个正整数a[i]。#一开始你在1号格子,并且手里有一个数字h0。
#当你在第 i 号格子,手里有数字 h 的时候,你有两个选择:
#(1)跳到第i + h号格子,手中的数字依然是h;
#(2)跳到第i + a[i]号格子,手中的数字变成a[i];
#在跳跃的过程中是不允许超出n号格子的。
#你想知道一共有多少种不同的路径,可以从1号格子跳到n号格子,两条路径是不同的当且仅当它们经过的格子集合是不同的。输出不同路径的条数除以998244353的余数。
#输入
#第一行包含两个整数n和h0;
#第二行包含n个正整数a[i];
#2 <= n <= 1000, 1 <= a[i], h0 <= n - 1
#样例输入
#5 1
#2 3 2 4 3
#样例输出
#4
#
#
#提示
#输入样例2
#3 10
#10 10 10
#
#输出样例2
#0
全部评论
(7) 回帖