Ciao a tutti qualcuno riesce a spiegarmi come nel secondo input (abcdefh) la distanza è di 0.75? Non dovrebbe essere di 1?
abcdefg D = 1;
-abcdefh- (S[i])
abcdefh D = 0;
abcdefi D = 1;
abcdefj D = 2,
la somma è 4 e si divide per 5 - 1 giusto? Grazie per il futuro aiuto!
Per la stringa “abcdefj” la distanza da “abcdefh” è 1.
Grazie! Beh si ho capito il mio problema, calcolavo il numero di posizioni che differiva ogni singola lettera, e comunque non riesco a prendere 100/100. Ho provato ad ottimizzare un po’ il tutto ma mi va fuori tempo.
Questo è il codice:
#include <iostream>
#include <fstream>
using namespace std;
int N, K;
string S[1000000];
long long sum[1000000];
int dist(string a, string b){
int length = 0;
for(int i = 0; i < K; ++i) if(a[i] != b[i]) ++length;
return length;
}
int main() {
int i, j;
ifstream cin("input.txt");
ofstream cout("output.txt");
cin >> N >> K;
for(i = 0; i < N; ++i) cin >> S[i];
float min = 1000000.f;
int pos = 0;
for(i = N - 1; i >= 0; --i){
for(j = i - 1; j >= 0; --j){
int x = dist(S[i], S[j]);
sum[i] += x;
sum[j] += x;
}
if((float)sum[i] / (N - 1) <= min){
min = (float)sum[i] / (N - 1);
pos = i;
}
}
cout << pos;
return 0;
}
Ciao, intanto nota che il fattore \frac{1}{N-1} è presente in tutte le distanze medie, quindi non ti serve dividere per N - 1 (e anzi rischi di incappare in problemi di precisione con i float).
In quanto ai TLE, la tua soluzione ha come complessità \mathcal{O}(N^2K). Per fare 100 ti serve una soluzione in \mathcal{O}(NK), in cui calcoli le distanza media di una stringa in \mathcal{O}(K).
Grazie mille, ci proverò!