This is an easy problem from uva judge http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=3399
Ad hoc, complete search, data structures.
How I did it
- Read the cards from the princess, read the cards from the prince.
- If the cards are equal to 0 stop the program.
- Generate all possible games with the cards. (12 possibles games).
- For every game find the lowest card to win the game and save that card in a set of probable answers.
- In all possible games try every possible answer and check if is enough to win every game.(12 games).
- Print the answer.
Hints
- Generate all possible games. (Always 12)
- The possible status of a game for prince: Win Win, Win Lose, Lose Win, Lose Lose.
- If we have a game Lose Lose, print -1.
Critical Input
1 2 3 51 52
Critical Output
4
Code
#include <iostream> #include <cstdio> #include <vector> #include <bitset> #include <set> using namespace std; typedef pair<int,int> ii; struct game { ii p1; ii p2; ii p3; }; vector<int>girl,boy; vector<game> gameArray; bitset<54> myCards; set<int> mySet; bool isWW(int pos) { game tmp = gameArray[pos]; if(tmp.p1.first < tmp.p1.second && tmp.p2.first < tmp.p2.second) return true; else return false; } vector<int> getNotUsed(int x, vector<int>vec) { vector<int> ans; for(int a=0; a<vec.size(); a++) if(x!=a) ans.push_back(vec[a]); return ans; } void generate() { vector<int> nGirl, nBoy; for(int x=0; x<girl.size(); x++) { for(int y=0; y<boy.size(); y++) { ii p1 = make_pair(girl[x], boy[y]); nGirl = getNotUsed(x,girl); nBoy = getNotUsed(y, boy); ii p2 = make_pair(nGirl[0], nBoy[0]); ii p3 = make_pair(nGirl[1], -1); game g1, g2; g1.p1 = p1;g1.p2 = p2;g1.p3 = p3; gameArray.push_back(g1); p2 = make_pair(nGirl[1], nBoy[0]); p3 = make_pair(nGirl[0], -1); g2.p1 = p1;g2.p2 = p2;g2.p3 = p3; gameArray.push_back(g2); } } } void print() { for(int u=0; u<gameArray.size(); u++) { game tmp = gameArray[u]; cout<<"Res\n"; cout<<tmp.p1.first<<" "<<tmp.p1.second<<endl; cout<<tmp.p2.first<<" "<<tmp.p2.second<<endl; cout<<tmp.p3.first<<" "<<tmp.p3.second<<endl<<endl; } } bool impossible() { int cont; for(int x=0; x<gameArray.size(); x++) { game tmp = gameArray[x]; cont = 0; if(tmp.p1.first > tmp.p1.second) cont++; if(tmp.p2.first > tmp.p2.second) cont++; if(cont == 2) return true; } return false; } int getProbAnswer() { for(int i=1; i<=52; i++) if(!myCards.test(i)) return i; return -1; } int getProbVal(int u) { game tmp = gameArray[u]; int card = tmp.p3.first; for(int i=card; i<=52; i++) if(!myCards.test(i)) return i; return -1; } int getAnswer() { set<int>:: iterator it; bool flag; int tmp,card; for(it=mySet.begin(); it!=mySet.end(); it++) { tmp = (*it); if(tmp == -1) return -1; flag = true; for(int a=0; a<gameArray.size(); a++) { if(isWW(a)) continue; game g1 = gameArray[a]; card = g1.p3.first; if(tmp < card) { flag = false; break; } } if(flag) return tmp; } return -1; } int main() { int a,b,c,x,y, tmpAnswer, answer; while(scanf("%d %d %d %d %d", &a, &b, &c, &x, &y)) { if(!a && !b && !c && !x && !y) break; girl.clear(),boy.clear();gameArray.clear(); girl.push_back(a);girl.push_back(b);girl.push_back(c); boy.push_back(x);boy.push_back(y); myCards.reset(); mySet.clear(); myCards.set(a, 1);myCards.set(b, 1);myCards.set(c, 1);myCards.set(x, 1);myCards.set(y, 1); generate(); //print(); if(impossible()) printf("-1\n"); else { for(int u=0; u<gameArray.size(); u++) { if(isWW(u)) { tmpAnswer = getProbAnswer(); mySet.insert(tmpAnswer); } else { tmpAnswer = getProbVal(u); mySet.insert(tmpAnswer); } } /*cout<<"Posibles respuestas"; for(set<int>::iterator it=mySet.begin(); it!=mySet.end(); it++) cout<< *it <<" "; cout<<endl;*/ answer = getAnswer(); printf("%d\n", answer); } } return 0; }
fabho… una ayuda porfa… me podrias insinuar que podria estar mal con mi codigo?
#include
using namespace std;
int main(){
int xemo[5];
while(cin>>xemo[0]>>xemo[1]>>xemo[2]>>xemo[3]>>xemo[4]){
if(xemo[0]==0 && xemo[1]==0 && xemo[2]==0 && xemo[3]==0 && xemo[4]==0)break;
int suma=0;
if(suma==2)cout<<-1<=y2)suma++;
if(x>=x2)suma++;
if(suma==2)cout<<-1<<endl;
else{
z-=(x+y);
int i=0;
while(i<5){
if(xemo[i]==z){z++;i=0;}
i++;
}
cout<<z<<endl;
}
}
return 0;
}
gracias
[…] rather tedious as well – they just search through all the possibilities. See: [here, here, here, […]