1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char*argv[]){
ifstream input("cannibales.in", ios::in);
int tCan, tNCan, resultat(0);
input >> tCan;
input >> tNCan;
while(tCan+tNCan){
resultat++;
if(tCan>=3){ // On enlève le maximum de canibales possibles
tCan-=2; // Deux sont sur le rivage de l'autre coté, un sur le bateau
}else if(tCan == 1 && tNCan >= 3){ // Voyage à deux non canibales et 1 canibale
tNCan-=1; // Un arrive à destination, l'autre est sur le bateau
tCan =0; // On déponse le dernier canibale de l'autre coté
}else if(tCan == 0 && tNCan == 2){ // Voyage à 2 non canibales, c'est le dernier voyage
tNCan = 0; // Celui qui est sur le bateau va chercher le dernier.
}else if(tCan == 0 && tNCan > 3){ // On evacue le reste des non-canibales
tNCan-=2;
}else if(tCan == 0 && tNCan ==3){ // Si il ne reste plus que 3 personnes, on fait un dernier aller
tNCan =0;
}else if(tCan == 2 && tNCan == 1){ // Si il reste deux canibales et un non canibales, on doit le faire en deux étapes
tCan-=1;
}else if(tCan == 1 && tNCan <=2 ){ // Si il reste 1 de chaque, dernier aller
tCan=0;
tNCan=0;
}else if(tCan == 2 && tNCan >=3){ // Si il ne reste que 2 canibales, on les fait voyager
tCan = 0;
}
}
cout << (resultat*2)-1 << endl; // On multiplie par deux car trajet = aller + retour et on enlève le dernier retour car il n'y en a pas
return 0;
} |
Partager