数字三角形 && 购物单

题目:

题目描述

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。

路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。

输入描述

输入的第一行包含一个整数N (1≤N≤100),表示三角形的行数。

下面的N 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。

输出描述

输出一个整数,表示答案。

思路:

对输入使用二维矩阵进行存储,对不使用的地方放置-1. 

从顶点出发,先判断向左走和向右走的次数,如相差不超过1,则选择下一行离它最近的两个数中的最大的数,如相差次数超过1,则只能选择下一行最左边或右边的数.

但这样找到的路径不是全局最大的路径!

后面看了别人的代码,发现思路都不一样。去遍历每一行,将上一行的元素加到该行中。由于左右深度不能相差>1,则路径最后都会走到最后一行最中间的位置(如为偶数行,即最后一行最中间有两个,则选择最大的那个数)

代码1:

import os
import sys

# 请在此输入您的代码
row = int(input())
data = [[-1 for i in range(row)]for j in range(row)]
for i in range(row):
  a = input().split(' ')
  for j in range(len(a)):
    data[i][j] = a[j]

sum = int(data[0][0])
left = right = 0
rol = 0
for deep in range(row-1):
  if abs(left-right) <= 1:
    if data[deep+1][rol] > data[deep+1][rol+1]:
      left = left + 1
      sum = sum + int(data[deep+1][rol])
      rol = rol
      continue
    else:
      right = right + 1
      sum = sum + int(data[deep+1][rol+1])
      rol = rol + 1
      continue
  else:
    if left > right:
      right = right + 1
      sum = sum + int(data[deep+1][rol+1])
      rol = rol + 1
      continue
    else:
      left = left + 1
      sum = sum + int(data[deep+1][rol])
      rol = rol
      continue

print(sum)

代码2:

import os
import sys


# 请在此输入您的代码
row = int(input())
data = [[-1 for i in range(row)]for j in range(row)]
for i in range(row):
  a = input().split() # .split()默认以空格为分隔符 不存在.split(' ')的写法
  for j in range(len(a)):
    data[i][j] = int(a[j])
#这里的输入处理 可以等价于一句:data = [list(map(int,input.split())) for i in range(row)]
for i in range(1, row):
  for j in range(0, i + 1):
    if j == 0:
      data[i][j] += data[i - 1][j]
    elif j == i:
      data[i][j] += data[i - 1][j - 1]
    else:
      data[i][j] += max(data[i - 1][j - 1], data[i - 1 ][j])
if row % 2 == 0:
  print(max(data[row - 1][row // 2 - 1], data[row-1][row//2]))
else:
  print(data[row - 1][row // 2])

题目:

现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物。

取款机只能提供 100100 元面额的纸币。小明想尽可能少取些现金,够用就行了。 你的任务是计算出,小明最少需要取多少现金。

以下是让人头疼的购物单,为了保护隐私,物品名称被隐藏了。

主要思路:

首先对输入的处理,我直接复制过来作为一个字符串,方便后续对其进行基于规则的分割,来得到我们想要的数据。将每个物品原价*打折价,计算其和。因为是个填空题,我直接输出的总价格,并没有对其进行取整后输出,知道价格后,人脑计算需要的整数钱,然后直接printf()。后面去看了别人的代码,发现math.ceil()函数,即进行向上取整,则只需对总价/100(因为只能取面额为100的纸币)后取整的数再*100,就是要取的面额100的现金! 

代码:

import os
import sys
import math
# 请在此输入您的代码
shapping = '****     180.90       88折 ****      10.25       65折 ****      56.14        9折 ****     104.65        9折****     100.30       88折****     297.15        半价****      26.75       65折****     130.62        半价****     240.28       58折****     270.62        8折****     115.87       88折****     247.34       95折****      73.21        9折****     101.00        半价****      79.54        半价****     278.44        7折****     199.26        半价****      12.97        9折****     166.30       78折****     125.50       58折****      84.98        9折****     113.35       68折****     166.57        半价****      42.56        9折****      81.90       95折****     131.78        8折****     255.89       78折****     109.17        9折****     146.69       68折****     139.33       65折****     141.16       78折****     154.74        8折****      59.42        8折****      85.44       68折****     293.70       88折****     261.79       65折****      11.30       88折****     268.27       58折****     128.29       88折****     251.03        8折****     208.39       75折****     128.88       75折****      62.06        9折****     225.87       75折****      12.89       75折****      34.28       75折****      62.16       58折 ****     129.12        半价 ****     218.37        半价  ****     289.69        8折'
data_2 = []
data_1 = shapping.split('****') #以****为分隔符
for i in data_1:
  data_2.append(i.replace('折', '').replace('半价', '5').split())  # 将 折 和 半 替换成空格和数字

sum = 0
for i in data_2[1:]:  # 这里从下标为1开始遍历,因为下标为0是个空列表,上面用的append 第一个空列表没有进行覆盖
  if len(i[1]) == 1:
    i[1] += '0'
    sum += (float(i[0])*int(i[1]))/100
  else:
    sum += (float(i[0])*int(i[1]))/100

print(math.ceil(sum/100)*10)  # math.ceil向上取整函数,如math.ceil(44.2) = 45
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值