È da un po’ che sto provando a risolvere City flooding ma con scarsi risultati
Il codice che sono riuscito a scrivere per ora è questo
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
int const MAXN=100;
int l, n, k, fattoriale[MAXN], A[MAXN], fine, ris=0;
int solve(int indice, int somma, int usati)
{
if(usati==k)
{
if(somma>=l)
return 1;
return 0;
}
int r=0;
for(int i=indice+1;i<fine;i++){
r+=solve(i, somma+A[i], usati+1);
r%=10007;
}
return r%10007;
}
int main()
{
ifstream in("input.txt");
ofstream out("output.txt");
in>>l>>n>>k;
fine=n-1;
for(int i=0;i<fine;i++) in>>A[i];
sort(A, A+fine);
reverse(A, A+fine);
fattoriale[0]=1;
fattoriale[1]=1;
for(int i=2;i<n;i++) fattoriale[i]=((fattoriale[i-1])%10007*i)%10007;
if(k==fine)
{
int som=0;
for(int i=0;i<fine;i++)
som+=A[i];
if(som>=l) out<<fattoriale[fine];
else out<<0;
return 0;
}
for(int i=0;i<fine-k+1;i++)
{
ris+=solve(i, A[i], 1);
ris%=10007;
}
int a=fattoriale[k]%10007, b=fattoriale[fine-k]%10007;
out<<(ris*a*b)%10007;
}
Che ottiene 40/100 con un unico task errato nel terzo subtask(non capisco come ) ed il quarto subtask va quasi completamente in TLE
Quello che faccio con il mio codice è generare le combinazioni decrescenti lunghe k>=l una volta trovate queste combinazione che corrispondo ai k tombini che possono rimanere prima della casa del sindaco , la risposta sarà data da queste combinazioni* le loro permutazioni* le permutazione dei tombini dopo la casa del sindaco.
Devo trovare qualche modo per velocizzarlo (magari con la memoizzazione che ho provato a pensare a come sfruttarla ma onestamente non mi è venuto in mente nulla) e anche capire perché sbaglia quel task nel subtask 3.
Grazie mille in anticipo.
Fabio.