CSES - Osinko

Annettuna on osakkeen hinta nn päivän aikana. Kuten aiemmassa tehtävässä, sinun tulee laskea kullekin päivälle suurin tuotto, jonka olisit voinut saada myymällä osakkeen kyseisenä päivänä.

Kuitenkin erona aiempaan saat myyntituoton lisäksi myös päivittäin osinkoa. Kun ostat osakkeen päivänä aa ja myyt sen päivänä bb, osingon suuruus on bab-a.

Esimerkiksi kun hinnat ovat [3,2,3,5,1,4][3,2,3,5,1,4], sinun tulee muodostaa lista [0,0,2,5,2,6][0,0,2,5,2,6]. Esimerkiksi viidennen päivän kohdalla suurin tuotto on 22, koska olisit voinut ostaa toisena päivänä osakkeen hintaan 22 ja myydä sen sitten hintaan 11. Tässä myyntituotto on 12=11-2=-1 ja osingon suuruus on 52=35-2=3, joten kokonaistuotto on 1+3=2-1+3=2.

Toteuta tiedostoon dividend.py funktio find_profits, jolle annetaan parametrina lista osakkeen hinnoista. Funktion tulee palauttaa yllä olevan kuvauksen mukainen lista. Kuten aiemminkin, tehtäväsi on toteuttaa tehokas ratkaisu, jonka aikavaativuus on O(n)O(n).

def find_profits(prices):
    # TODO

if __name__ == "__main__":
    print(find_profits([1, 2, 3, 4])) # [0, 2, 4, 6]
    print(find_profits([4, 3, 2, 1])) # [0, 0, 0, 0]
    print(find_profits([1, 1, 1, 1])) # [0, 1, 2, 3]
    print(find_profits([2, 4, 1, 3])) # [0, 3, 1, 4]
    print(find_profits([1, 1, 5, 1])) # [0, 1, 6, 3]
    print(find_profits([3, 2, 3, 5, 1, 4])) # [0, 0, 2, 5, 2, 6]

    prices = list(range(1, 10**5+1))
    print(find_profits(prices)[:5]) # [0, 2, 4, 6, 8]