Fede37
6 Aprile 2022, 4:48pm
1
Buongiorno, ho cercato di risolvere Domino Massimale ma riesco a totalizzare un massimo di 89.47 punti. Sbaglio nei subtask 11 e 17, che sono invece gli unici a risultare corretti aggiungendo uno all’output. Immagino di non aver considerato un caso particolare che non riesco ad identificare. Di seguito il mio programma
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int quanti(vector<int> F,vector<int>L,int a,int b){
int finish=true;
if(a<0){
int l=b;
a=F[l];
b=L[l];
L.erase(L.begin()+l);
F.erase(F.begin()+l);
}
for(int r=0;r<F.size();r++){
if(a==F[r]){
a=L[r];
L.erase(L.begin()+r);
F.erase(F.begin()+r);
finish=false;
break;
}
if(a==L[r]){
a=F[r];
L.erase(L.begin()+r);
F.erase(F.begin()+r);
finish=false;
break;
}
if(b==F[r]){
b=L[r];
L.erase(L.begin()+r);
F.erase(F.begin()+r);
finish=false;
break;
}
if(b==L[r]){
b=F[r];
L.erase(L.begin()+r);
F.erase(F.begin()+r);
finish=false;
break;
}
}
if(finish){
return 1;
}
return 1+quanti(F,L,a,b);
}
int main(){
ifstream cin("input.txt");
//ofstream cout("output.txt");
int N;
int x=0;
int tmp=0;
vector<int> A;
vector<int> B;
cin>>N;
A.resize(N);
B.resize(N);
for(int i=0;i<N;i++){
cin>>A[i];
cin>>B[i];
}
for(int i=0;i<N;i++){
tmp=quanti(A,B,-1,i);
if(tmp>x){
x=tmp;
}
}
cout<<x<<endl;
}
Grazie in anticipo per l’aiuto
qwfwq
6 Aprile 2022, 6:00pm
2
Ciao, prova con questo:
8
0 1
6 1
0 6
0 0
6 6
2 3
3 4
4 5
Fede37
6 Aprile 2022, 8:15pm
3
Grazie, l’ho adattato all’input che mi hai dato e risolve anche l’11, tuttavia non il 17
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int quanti(vector<int> F,vector<int>L,int a,int b){
int x=0;
int finish=true;
if(a<0){
int l=b;
a=F[l];
b=L[l];
L.erase(L.begin()+l);
F.erase(F.begin()+l);
}
for(int i=0;i<F.size();i++){
if(F[i]==L[i] and (F[i]==a or F[i]==b)){
x++;
F.erase(F.begin()+i);
L.erase(L.begin()+i);
i=0;
}
}
for(int r=0;r<F.size();r++){
if(a==F[r]){
a=L[r];
L.erase(L.begin()+r);
F.erase(F.begin()+r);
finish=false;
break;
}
if(a==L[r]){
a=F[r];
L.erase(L.begin()+r);
F.erase(F.begin()+r);
finish=false;
break;
}
if(b==F[r]){
b=L[r];
L.erase(L.begin()+r);
F.erase(F.begin()+r);
finish=false;
break;
}
if(b==L[r]){
b=F[r];
L.erase(L.begin()+r);
F.erase(F.begin()+r);
finish=false;
break;
}
}
if(finish){
return 1;
}
return 1+quanti(F,L,a,b)+x;
}
int main(){
ifstream cin("input.txt");
//ofstream cout("output.txt");
int N;
int x=0;
int tmp=0;
vector<int> A;
vector<int> B;
cin>>N;
A.resize(N);
B.resize(N);
for(int i=0;i<N;i++){
cin>>A[i];
cin>>B[i];
}
for(int i=0;i<N;i++){
tmp=quanti(A,B,-1,i);
if(tmp>x){
x=tmp;
}
}
cout<<x<<endl;
}
qwfwq
6 Aprile 2022, 9:12pm
4
Ho notato che nelll’input dato se la tessera 0-0 la si mette all’inizio funziona correttamente anche la versione precedente del tuo algoritmo. Quindi, probabilmente, il tuo codice non controlla tutte le disposizioni possibili delle N tessere per cercare la sequenza più lunga. Quindi non si tratta di adattare il codice ad ogni input ma di controllare tutte le combinazioni possibili e trovare quella giusta.
Fede37
6 Aprile 2022, 9:33pm
5
Grazie, avevi ragione, ho corretto e ora va