Mi chiedo se sia giusta la correzione… 0/100 …
Mi sembra davvero troppo strano, per es. nel caso di tutti 1 o 2 ho letteralmente eseguito migliaia di prove e sono ragionevolmente sicuro che sia corretto.
Ho eseguito test con decine di migliaia di input generati random fino a 100000 cifre, e verificando con un altro eseguibile più lento ed esaustivo … se il risultato fosse stato anche solo 1/100 ci crederei … ma 0/100 !!!
E’ possibile avere anche soltanto un singolo input utilizzato nei test ? giusto per levarmi il dubbio
ecco il sorgente inviato
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
vector<string> cosaRimuovere;
string outputNum = "", inputNum = "", numNoMul3 = "";
int resto = 0;
void erase_all_of(string &S, char C) {
int p = S.find(C);
while(p>=0) {
S.erase(p, 1);
p = S.find(C);
}
}
void erase_first_of(string &S, char C) {
int p = S.find(C);
if(p>=0) S.erase(p, 1);
}
int mod3(string I) {
int ret=0;
for (char d: I) ret=(ret+(d-'0'))%3;
return ret;
}
void rimuovi() {
if (cosaRimuovere.empty()) {
outputNum = "-1";
} else {
outputNum = "";
for (string cifre:cosaRimuovere) {
string soluzione=inputNum;
for (char c: cifre) erase_first_of(soluzione, c);
if(soluzione > outputNum) outputNum = soluzione;
}
outputNum.erase(0, outputNum.find_first_not_of('0'));
if (outputNum=="") outputNum = "-1";
}
}
void combina(int k, int iter, string rimuovi) {
if (rimuovi.size() < k) {
for(int i = iter; i < numNoMul3.size(); i++) {
rimuovi += numNoMul3[i];
combina(k, i+1, rimuovi);
rimuovi.erase(rimuovi.end()-1);
}
} else {
if ((resto==mod3(rimuovi)) && (!count(cosaRimuovere.begin(), cosaRimuovere.end(), rimuovi))) cosaRimuovere.push_back(rimuovi);
}
}
string trova(string I) {
numNoMul3 = inputNum = I;
for (char c: {'0','3','6','9'}) erase_all_of(numNoMul3, c);
resto = mod3(inputNum);
if (resto) {
cosaRimuovere.clear();
for(int i=1; i<3; i++) if (cosaRimuovere.empty()) combina(i, 0, "");
rimuovi();
} else {
outputNum = inputNum;
}
return outputNum;
}
int main() {
ifstream cin("input.txt");
ofstream cout("output.txt");
int N;
cin >> N;
for (int i = 0; i < N; i++) {
string V, O;
cin >> V;
O = trova(V);
cout << O << endl;
}
return 0;
}