洛谷 官方题库 python 第四天

[[10, 6.0], [20, 5.0], [30, 4.0], [15, 3.0]]如何按第二个排序

data = [[10, 6.0], [20, 5.0], [30, 4.0], [15, 3.0]]

sorted_data = sorted(data, key=lambda x: x[1])

print(sorted_data)

这个代码中,key=lambda x: x[1] 指定了排序的关键字,即按照每个子列表的第二个元素进行排序。在这个例子中,sorted_data 将会是按照第二个元素从小到大排列的排序结果。

P2240 【深基12.例1】部分背包问题

简单

P1223 排队接水

如果你想计算累加和,从第一个元素开始逐步累加,每次将当前累加和加上当前子列表的第一个元素即可。以下是一个实现的示例:

lm = [[10, 6.0], [20, 5.0], [30, 4.0], [15, 3.0]]

# 初始化累加和为0
cumulative_sum = 0
mm = 0

# 遍历 lm 中的每个子列表
for sublist in lm:
    # 将当前子列表的第一个元素加到累加和中
    cumulative_sum += sublist[0]
    # 将当前累加和加到 mm 中
    mm += cumulative_sum

print(mm)  # 输出结果为 175,即 10 + (10+20) + (10+20+30) + (10+20+30+15)

RE,没通过,有空回来改

n=int(input())
li=[]
lm=[]
for i in range(n):
    li+=map(int,input().split())
for j in range(1,n+1):
    lm+=[[li[j-1],j]]
lm.sort(key=lambda x:x[0])
for m in range(n):
    print(lm[m][1],end=" ")
print()
sum=0
for m in range(len(lm)-1):
    sum+=(lm[m][0])*(n-m)
av = sum/n
print("{:.2f}".format(av))

下面是大佬代码

n=int(input())
li=[]
lm=[]
for i in range(n):
    li+=map(int,input().split())
for j in range(1,n+1):
    lm+=[[li[j-1],j]]
lm.sort(key=lambda x:x[0])
for m in range(n):
    print(lm[m][1],end=" ")
print()
sum=0
for m in range(len(lm)-1):
    sum+=(lm[m][0])*(n-m)
av = sum/n
print("{:.2f}".format(av))

P3817

liss+=int(input().split())

报错

liss=[]
for i in range(n):
    liss+=[int(input().split())]

报错

input().split() 返回的是一个包含多个数字的列表,你不能直接将其添加到列表中。你需要使用 map() 函数将每个数字转换为整数后再添加到列表中。

liss = []
for i in range(n):
    liss+=map(int,input().split())
##或
liss = list(map(int, input().split()))
###都是对的

###第一个好像有点问题?要具体情况具体分析把

没问题

cnn=0
j=0
if j<n-1:
     if liss[j]+liss[j+1]>x:
         liss[j+1]-=1
         cnn+=1
     else:
         j+=1
#错的
while j<n-1:
     if liss[j]+liss[j+1]>x:
         liss[j+1]-=1
         cnn+=1
     else:
         j+=1
n,x=map(int,input().split())
liss = list(map(int, input().split()))
cnn=0
j=0
while j<n-1:
     if liss[j]+liss[j+1]>x:
         liss[j+1]-=1
         cnn+=1
     else:
         j+=1
print(cnn)
###部分超时
n, x = map(int, input().split())
liss = list(map(int, input().split()))

cnn = 0
for i in range(n - 1):
    if liss[i] + liss[i + 1] > x:
        diff = liss[i] + liss[i + 1] - x
        liss[i + 1] = max(0, liss[i + 1] - diff)
        cnn += diff

print(cnn)
###AC解

pop()remove() 都是用于列表操作的方法,但它们的功能不同。

my_list = [1, 2, 3, 4, 5]
# 删除索引为 2 的元素,并返回被删除的值
deleted_value = my_list.pop(2)
print(my_list)  # 输出 [1, 2, 4, 5]
print(deleted_value)  # 输出 3


my_list = [1, 2, 3, 4, 5]
# 删除值为 3 的元素
my_list.remove(3)
print(my_list)  # 输出 [1, 2, 4, 5]

好像要用指针,先学学

尺取法

要实现双指针,一个从前往后移动,一个从后往前移动,并且它们轮流移动

在同一个循环写两次指针移动,一个左,一个右

PS:我一直想在两层循环中指针依次移动,不对

n=int(input())
lis=list(map(int,input().split()))
lis.append(0)
lis.sort()


count, expend = 0, 0
left, right = 0, n

def jump(x, y):
    global expend
    expend += (lis[y] - lis[x]) ** 2
    return expend

while count < n:
    jump(left, right)
    left += 1  # 左指针右移
    jump(left, right)
    right -= 1  # 右指针左移
    count += 2

print(expend)

好好利用def函数,简化步骤

学一下指针移动

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值