例题8-17 不公平竞赛(Foul Play, ACM/ICPC NWERC 2012, UVa1609)

来源:互联网 发布:pdf修改软件 编辑:程序博客网 时间:2024/06/05 14:51
思路:
n = 2时,只要满足条件,目标队伍便能获胜。
采取递归分治的解法,每一步构造出满足条件的状态。
对每一步的构造方法:
首先选取黑色队与灰色队配对;再配对目标队;优先黑色队配对;剩下任意配对。


数据读入可以用char存储,%s输入。
#include <set>#include <map>#include <ctime>#include <cmath>#include <stack>#include <queue>#include <deque>#include <cstdio>#include <string>#include <vector>#include <cctype>#include <sstream>#include <utility>#include <cstring>#include <cstdlib>#include <functional>#include <iostream>#include <algorithm>#define SF(a) scanf("%d", &a)#define PF(a) printf("%d\n", a)  #define SFF(a, b) scanf("%d%d", &a, &b)  #define SFFF(a, b, c) scanf("%d%d%d", &a, &b, &c)#define SFFFF(a, b, c, d) scanf("%d%d%d%d", &a, &b, &c, &d)#define CLEAR(a, b) memset(a, b, sizeof(a))#define IN() freopen("in.txt", "r", stdin)#define OUT() freopen("out.txt", "w", stdout)#define FOR(i, a, b) for(int i = a; i < b; ++i)#define LL long long#define maxn 1025#define maxm 205#define mod 1000000007#define inf 1000000007#define eps 1e-4using namespace std;int buf[20], l;int read() {int x = 0; char ch = getchar(); bool f = 0;while (ch < '0' || ch > '9') { if (ch == '-') f = 1; ch = getchar(); }while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();return f ? -x : x;}void write(int x) {if (!x) { putchar(48); return; }l = 0; if (x < 0) putchar('-'), x = -x;while (x) buf[++l] = x % 10, x = x / 10;while (l) putchar(buf[l--] + 48);}//-------------------------chc------------------------------//bool G[maxn][maxn];int main() {//IN(); OUT();int n;while (~SF(n)) {FOR(i, 1, n + 1) {getchar();FOR(j, 1, n + 1) G[i][j] = getchar() - '0';}vector<int> win, lose;FOR(i, 2, n + 1) {if (G[1][i]) win.push_back(i);else lose.push_back(i);}while (n > 1) {vector<int> nw, nl, last;n >>= 1;FOR(i, 0, lose.size()) {int v = lose[i];bool matched = false;FOR(j, 0, win.size()) {int &u = win[j];if (u > 0 && G[u][v]) {printf("%d %d\n", u, v);nw.push_back(u);u = 0;//直接通过把值修改为0,表示已匹配matched = true;break;}}if (!matched) last.push_back(v);}bool first = true;FOR(i, 0, win.size()) {int u = win[i];if (u) {if (first) printf("1 %d\n", u), first = false;else last.push_back(u);}}for (int i = 0; i < last.size(); i += 2) {int u = last[i], v = last[i + 1];printf("%d %d\n", last[i], last[i + 1]);int cur = G[u][v] ? u : v;if (G[1][cur]) nw.push_back(cur);else nl.push_back(cur);}win = nw, lose = nl;}}return 0;}

原创粉丝点击