sottoponendo il seguente codice ottengo 30 punti e non capisco perchè non fa le altre subtask:
with open("input.txt","r") as f:
N,B=map(int,f.readline().strip().split())
v=list(map(int,f.readline().strip().split()))
c=0
temp=1000
if B>=sum(v):
with open("output.txt","w") as f:
f.write(str(sum(v)))
else:
for i in range(1,N):
c=v[i]
for j in range(N):
c+=v[j]
if c>=B and c<=temp:
temp=c
with open("output.txt","w") as f:
f.write(str(temp))
Ciao, in genere è buona cosa oltre mettere il codice dare un minimo di spiegazione sul come funziona.
Comunque, allora la tua soluzione è O(N^2) greedy. Detto questo nulla ti garantisce debba funzionare, mi spiego. Quello che il tuo codice fa è prende un elemento partendo da 1(ossia il secondo, e qua già un primo problema, che ignori le sequenze che iniziano col primo elemento, che in realtà mezzo consideri dopo però non so quando fosse volontaria questa scelta), quindi dicevo, partendo dal secondo elemento fai un ciclo per ogni elemento(questa volta anche 0), e qua sorge il secondo problema. Ammetti soluzioni “con doppi elementi”, che capitano quando facendo il secondo ciclo raggiungi j=i e a quel punto sommi nuovamente lo stesso “regalo” due volte, che è contro le indicazioni del problema.
Detto questo l’approccio stesso è sbagliato, quello che trova è “la sottosequenza contigua con un elemento talvolta esterno(il i) con valore >=B minima”, il problema invece chiete un sottoinsieme, che non necessariamente è contiguo. Quindi va proprio cambiato l’approccio. Spoiler: se sei proprio bloccato qua C++ set (Christmas) - Olimpiadi di informatica - YouTube c’è una soluzione spiegata.