首页 > 试题广场 >

Highest Price in Supply Chain

[编程题]Highest Price in Supply Chain
  • 热度指数:7353 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
A supply chain is a network of retailers(零售商), distributors(经销商), and suppliers(供应商)-- everyone involved in moving a product from supplier to customer.

Starting from one root supplier, everyone on the chain buys products from one's supplier in a price P and sell or distribute them in a price that is r% higher than P.
It is assumed that each member in the supply chain has exactly one supplier except the root supplier, and there is no supply cycle.

Now given a supply chain, you are supposed to tell the highest price we can expect from some retailers.

输入描述:
Each input file contains one test case.  For each case, The first line contains three positive numbers: N (<=105), the total number of the members in the supply chain (and hence they are numbered from 0 to N-1); P, the price given by the root supplier; and r, the percentage rate of price increment for each distributor or retailer.  Then the next line contains N numbers, each number Si is the index of the supplier for the i-th member.  Sroot for the root supplier is defined to be -1.  All the numbers in a line are separated by a space.


输出描述:
For each test case, print in one line the highest price we can expect from some retailers, accurate up to 2 decimal places, and the number of retailers that sell at the highest price.  There must be one space between the two numbers.  It is guaranteed that the price will not exceed 1010.
示例1

输入

9 1.80 1.00
1 5 4 4 -1 4 5 3 6

输出

1.85 2
from math import ceil, floor
class Tree:
    def __init__(self,t,p,r,root):
        self.t=t
        self.p=p
        self.r=1+0.01*r
        self.root=root
        self.max=p
        self.result=[]
        self.search(root,p)
    def search(self,j,p):
        self.t[j].append(p)
        if len(self.t[j][0]):
            for i in self.t[j][0]:
                self.search(i,p*self.r)
        else:
            if self.max<p:
                self.result=[]
                self.result.append(j)
                self.max=p
            elif self.max==p:
                self.result.append(j)
            return
    def getResult(self):
        return len(self.result),self.max

s=input().split()
n=int(s[0])
p=float(s[1])
r=float(s[2])
t={}
root=0
s=input().split()
for i in range(n):
    t[i]=[[]]
for i in range(n):
    if s[i]=='-1':
        root=i
    else:
        t[int(s[i])][0].append(i)
t=Tree(t,p,r,root)
result,maxprice=t.getResult()
maxprice*=100
if maxprice-ceil(maxprice)>0.5:
    maxprice+=1
maxprice/=100
print("{:.2f}".format(maxprice),result)
pyhton在处理类方面和C++确实没有可比性啊,排行榜上的全是C++。
一开始总是通不过,检查好久才发现问题出在了四舍五入上,python的四舍五入机制有点奇怪啊。
发表于 2019-09-07 12:05:14 回复(0)
try:
    while True:
        n,p,r = list(map(float,input().split()))
        nodes = list(map(int,input().split()))
        result = []
        for node in nodes:
            index = 0
            while node != -1:
                index += 1
                node = nodes[node]
            result.append(round(p*(r/100+1)**index,2))
        print('%.2f %d'%(max(result),result.count(max(result))))
except Exception:
    pass
编辑于 2018-11-18 22:38:22 回复(0)