题目:http://community.topcoder.com/stat?c=problem_statement&pm=13144&rd=15853
逆向选择,不断剔除条件。
代码:
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <bitset>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cmath>
#include <cstring>
#include <ctime>
#include <climits>
using namespace std;
#define CHECKTIME() printf("%.2lf\n", (double)clock() / CLOCKS_PER_SEC)
typedef pair<int, int> pii;
typedef long long llong;
typedef pair<llong, llong> pll;
#define mkp make_pair
#define FOREACH(it, X) for(__typeof((X).begin()) it = (X).begin(); it != (X).end(); ++it)
/*************** Program Begin **********************/
class CandidatesSelection {
public:
string possible(vector <string> score, vector <int> result) {
vector < pii > cond;
int n = result.size();
int m = score[0].size();
for (int i = 0; i < n - 1; i++) {
cond.push_back( mkp(result[i], result[i + 1]) );
}
bool used[55];
memset(used, 0, sizeof(used));
while (!cond.empty()) {
bool isIndex = true;
int r = cond.size();
for (int i = 0; i < r; i++) {
isIndex &= (cond[i].first < cond[i].second);
}
if (isIndex) {
break;
}
bool removed = false;
for (int i = 0; i < m; i++) {
if (used[i]) {
continue;
}
bool ok = true;
for (int j = 0; j < r; j++) {
ok &= ( score[ cond[j].first ][i] <= score[ cond[j].second ][i] );
}
if (!ok) {
continue;
}
used[i] = true;
vector < pii > newcond;
for (int j = 0; j < r; j++) {
if (score[ cond[j].first ][i] == score[ cond[j].second ][i]) {
newcond.push_back(cond[j]);
}
}
if (newcond.size() == cond.size()) {
continue;
}
removed = true;
cond = newcond;
break;
}
if (!removed) {
return "Impossible";
}
}
return "Possible";
}
};
/************** Program End ************************/