Ciao a tutti, stavo cercando di risolvere Ping Pong, ma non capisco perché non prendo nessun punto anche se tutti gli esempi mi escono giusti.
Questo e’ il codice:
#include <iostream>
#include <fstream>
using namespace std;
void vittoria(int B){
int A = 11;
int C = B/3;
for (int i = 0; i < 2; ++i) {
cout << A << " " << C << endl;
B -= C;
}
cout << A << " " << B << endl;
}
int main() {
//ifstream cin("input.txt");
//ifstream out("output.txt");
int T;
cin >> T;
for (int test = 1; test <= T; ++test) {
int A, B;
cin >> A >> B;
int C = -1, D = -1;
// INSERT YOUR CODE HERE
if(A >= 33 && A <= 53 && B <= 52 && A > B){
int r = A - 33;
if(r == 0 && B <= 30){// 3 set
vittoria(B);
}else if(r <= 10 && B >= 11 && B <= 43){//4 set
cout << r << " 11" << endl;
B -= 11;
vittoria(B);
}else if(B >= 22){//5 set
int tempR = r/2;
cout << tempR << " 11" << endl;
cout << r - tempR << " 11" << endl;
B -= 22;
vittoria(B);
}else
cout << C << " " << D << endl;
}else
cout << C << " " << D << endl;
}
return 0;
}
Stando al tuo codice risulta che A non può vincere la partita se A <= B (in tal caso stampi sempre -1 -1
). Ma in realtà A può vincere la partita anche avendo meno punti del suo avversario. Per esempio se l’input fosse il seguente
1
38 43
Un possibile output potrebbe essere:
11 1
5 11
11 10
11 10
In questo modo A vince la partita rispettando tutte le regole imposte, nonostante abbia totalizzato meno punti di B
Ho cambiato il codice e ora mi funziona questo caso però continuo a prendere 0/100 quindi sbaglio anche quando è possibile vincere con 3 set, ma continuo a non capire quale sia il problema.
Questo è il codice:
#include <iostream>
#include <fstream>
using namespace std;
void vittoria(int B){
int A = 11;
int C = B/3;
for (int i = 0; i < 2; ++i) {
cout << A << " " << C << endl;
B -= C;
}
cout << A << " " << B << endl;
}
int main() {
//ifstream cin("input.txt");
//ifstream out("output.txt");
int T;
cin >> T;
for (int test = 1; test <= T; ++test) {
int A, B;
cin >> A >> B;
int C = -1, D = -1;
// INSERT YOUR CODE HERE
if(A >= 33 && A <= 53 && B <= 52){
int r = A - 33;
if(r == 0 && B <= 30){// 3 set
vittoria(B);
}else if(r <= 10 && B >= 11 && B <= 41){//4 set
cout << r << " 11" << endl;
B -= 11;
vittoria(B);
}else if(B >= 22){//5 set
int tempR = r/2;
cout << tempR << " 11" << endl;
cout << r - tempR << " 11" << endl;
B -= 22;
vittoria(B);
}else
cout << C << " " << D << endl;
}else
cout << C << " " << D << endl;
}
return 0;
}
Con input 33 51
il tuo codice stampa
0 11
0 11
11 9
11 9
11 11
L’ultimo set non rispetta le regole del gioco
Ora funziona, grazie mille
Figurati! Inoltre faccio notare come sia anche possibile utilizzare la programmazione dinamica per risolvere il problema senza dover ragionare troppo sui vari corner case ecc…
In particolare, considerati le assunzioni, si può utilizzare dp(pts_a, pts_b, rounds_a, rounds_b)
per modellare lo stato della partita (i parametri rappresentano rispettivamente i punti che deve effettuare il giocatore a, i punti che deve effettuare il giocatore b, i round che ha già vinto il giocatore a, i round che ha già vinto il giocatore b). Diciamo che uno stato è True
se permette di concludere la partita seguendo le regole del testo.
Abbiamo che se: pts_a < 0 or pts_b < 0 || rounds_a > 3 || rounds_b > 3
allora non è possibile concludere la partita correttamente.
Abbiamo che gli stati dp(11, x (con x da 0 a 10), 2, y (con y da da 0 a 2))
risultano True
.
Altrimenti proviamo a vedere se esiste un punteggio per il seguente round che ci permette di arrivare a uno stato del gioco “corretto”.
Quindi ipotizziamo che il seguente round l’abbia vinto a
(ottenendo gli stati dp(pts_a - 11, pts_b - x (con x da 0 a 10), rounds_a + 1, rounds_b)
) o che l’abbia vinto b
(ottenendo gli stati dp(pts_a - x (con x da 0 a 10), rounds_a, rounds_b + 1)
), basta che anche solo uno degli stati analizzati sia True
per rendere lo stato originale True
2 Mi Piace