Bitcoin traiding: problema arrotondamento

Ciao a tutti,
Sto provando a risolvere Bitcoin Trading
Ma non riesco a ottenere 100/100…
Credo sia un problema relativo all’arrotondamento

#pragma GCC optimize("Ofast")
#pragma GCC optimization("unroll-loops")#include <bits/stdc++.h>

#include<algorithm>

#include <string.h>

#define mod 1000000007

using namespace std;

ifstream in ("input.txt");
ofstream out("output.txt");
//input data

long n, x, s;
long double p, so = 0, q = 0;

void somma(vector < long > & v) {
    vector < long > copy(v.size());
    bool ck;
    for (int i = 0; i < n; i++) {
        if (i == 0) {
            s += v[i];
            ck = v[i] > 0; //TRUE: POSITIVO
        } else {
            if (ck) {
                //finora positivi
                if (v[i] < 0) {
                    copy.push_back(s);
                    s = v[i];
                    ck = false;
                } else s += v[i];

            } else {
                //finora negativi
                if (v[i] > 0) {
                    copy.push_back(s);
                    s = v[i];
                    ck = true;
                } else s += v[i];
            }
        }
    }
    copy.push_back(s);
    v = copy;
    return;
}

int main() {
    in >> n >> p;
    vector < long > num(n);
    for (int i = 0; i < n; i++) in >> num[i];

    somma(num); //la funzione somma somma tutti i positivi consecutivi e i negativi consecutivi

    if (num.front() > 0) {
        //se all inizio la tendenza sarà positiva conviene comprare
        q = so / p;
        so = 0;
        p += num.front();
    } else {
        //se all inizio la tendenza sarà negativa conviene vendere
        so = p;
        p += num.front();
        q = so / p;
        so = 0;
    }

    while (num.size() != 0) { //continua finche non finiscono i valori
        if (num.front() > 0) {
            //se la prossima tendenza è positiva
            if (q == 0) {
                //se io non ho bitcoin devo comprarli
                q = so / p;
                so = 0;

            }
            p += num.front(); //incremento il valore del bitcoin
        } else {
            if (q != 0) {
                //se ho qualche bitcoin devo venderlo
                so += q * p;
                q = 0;
            }
            p += num.front(); //incremento il valore del bitcoin
        }
        num.erase(num.begin()); //cancello sempre il valore appena usato
    }

    if (q != 0) {
        //se ho qualche bitcoin il valore del mio wallet è Q*P
        out << fixed << setprecision(15) << q * p;
        return 0;
    }
    //se non ho bitcoin vuol dire che li ho venduti poco prima ottenendo i soldi pari all'ultimo prezzo del bitcoin
    out << fixed << setprecision(15) << p;

}

Il programma è relativamente veloce (credo di poter entrare in classifica)
Potreste dare un occhiata?? Grazie :upside_down_face:

Ciao,
dovresti ricontrollare la funzione somma() perché a me restituisce sempre un vettore nullo.