quasi tutti i tasktest mi danno l’errore “Execution killed (could be triggered by violating memory limits)” , ma nessuno dei 35 supera 1MiB di memoria (max: 64MiB), il codice è questo
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <set>
#include <numeric>
static FILE *fr, *fw;
// Declaring variables
static int N;
static long long M;
static int* V;
static int B;
int quadri(int N, long long M, int V[]) {
int B = 2*N;
long long int c = 0, g = 0;
std::multiset<long long int, std::greater<long long int>> vb;
//qua controllo se il valore del quadro più costoso è più grande di M, la funzione risulta 0
for (int i = 0; i < N-1; i++){
if (V[i] > g) g = V[i];
}
if (g>M) return 0;
//qua dimezzo il valore di B, faccio tutti i gruppi possibili di grandezza B e vedo se la loro somma supera M
//se lo fa, allora ricomincio, se non lo fa vado avanti
do{
B /= 2;
c = 0;
vb.clear();
for (int i = 0; i <N-B; i++){
vb.insert(std::accumulate(V + c, V + c + B + 1, 0));
c++;
}
}while(*vb.rbegin()>M);
//qua vedo di quella metà di troppo che ho dimezzato, in quale valore di B si aveva il risultato corretto
do{
B++;
c = 0;
vb.clear();
for (int i = 0; i <N-B; i++){
vb.insert(std::accumulate(V + c, V + c + B + 1, 0));
c++;
}
}while(*vb.rbegin()>M);
return B;
}
int main() {
fr = stdin;
fw = stdout;
// Iterators used in for loops
int i0;
// Reading input
fscanf(fr, "%d %lld", &N, &M);
V = (int*)malloc(N * sizeof(int));
for (i0 = 0; i0 < N; i0++) {
fscanf(fr, "%d", &V[i0]);
}
// Calling functions
B = quadri(N, M, V);
// Writing output
fprintf(fw, "%d\n", B);
fclose(fr);
fclose(fw);
return 0;
}