Foul Play UVA

来源:互联网 发布:小孩刘心悠原帖知乎 编辑:程序博客网 时间:2024/06/05 17:46

思路和紫书相同,首先记录队伍1能够打败哪些队伍,以及哪些队伍会打败队伍1,然后对于那些会打败队伍1的队伍,每次都从队伍1能够赢的队伍中找出某一队,正好打败这个队伍,如果找不到,那么就将这些队伍放置到容器fin中,以便后续处理,然后从队伍1的赢得的队伍中找出某一位,让队伍1打败,然后将其余的保存到容器中,让那些在fin中的队伍相互对打,将那些胜利队伍放置到对应的容器中,以此迭代,同时在迭代的过程中输出结果,具体实现见如下代码:

#include<iostream>#include<vector>#include<string>#include<set>#include<stack>#include<queue>#include<map>#include<algorithm>#include<cmath>#include<iomanip>#include<cstring>#include<sstream>#include<cstdio>#include<deque>#include<functional>using namespace std;const int maxn = 1024 + 10;int data[maxn][maxn];int main(){int n;while (cin >> n){for (int i = 1; i <= n; i++){string t;cin >> t;for (int j = 0; j < n; j++)data[i][j + 1] = t[j] - '0';}vector<int> win, lose;for (int i = 2; i <= n; i++){if (data[1][i] == 1) win.push_back(i);else lose.push_back(i);}while (n > 1){vector<int> win2, lose2, fin;for (int i = 0; i < lose.size(); i++){int id = lose[i];bool get = false;for (int j = 0; j < win.size(); j++){if (win[j]>0&&data[win[j]][id] == 1){get = true;win2.push_back(win[j]);cout << win[j] << " " << id << endl;win[j] = 0;break;}}if (!get){fin.push_back(id);}}bool first = true;for (int i = 0; i < win.size(); i++){if (win[i] > 0){if (first){cout << "1 " << win[i] << endl;first = false;}else{fin.push_back(win[i]);}}}for (int i = 0; i < fin.size(); i += 2){cout << fin[i] << " " << fin[i + 1] << endl;int id = fin[i];if (data[fin[i]][fin[i + 1]] == 0) id = fin[i + 1];if (data[1][id] == 1) win2.push_back(id);else lose2.push_back(id);}win = win2;lose = lose2;n >>= 1;}}return 0;}

原创粉丝点击