Jedyne, co mi się tu nie podoba, to sposób w jak liczysz powierzchnię wielokąta:
minisum = listX[i] * (listY[-1] - listY[i - 1])
Pierwszy i ostatni punkt na liście są takie same, więc powyższa linijka wykona się dwa razy, dla tego samego punktu.
Ja zazwyczaj piszę:
for i in range(1, len(listX)):
minisum = listX[i] * listY[i-1] - listX[i-1] * listY[i]
I nie potrzeba żadnych dodatkowych ifów
Druga sprawa to:
overall = math.ceil(black*10)+ math.ceil(grey*6)
print(int(overall))
Nie wiem, czy potrzebne są tutaj wywołania ceil
. Samo rzutowanie na inta w kolejnej linijce powinno załatwić sprawę.