Foul Play UVA

来源:互联网 发布:淘宝联盟qq群推广步揍 编辑:程序博客网 时间:2024/05/21 04:40

题目传送门

题意:有n只队伍(n是2的整数幂)打淘汰赛,每一轮都是两两配对,胜利者进入下一轮。每一只队伍的实力都是确定的,你最喜欢编号为一的队伍,设计一个方案让队伍一一定胜利。

思路:这个题目有两个关键性的条件
条件1:1号队伍至少能打败一半的队伍。
条件2:对于不能直接打败的队伍t,存在能够打败的队伍t1,t1能够打败t。
这两个条件是至关重要的,设计三个阶段
阶段1:尽可能的消灭队伍1无法打败的队伍
阶段2:在还没匹配的队伍中找到一个1号队伍能够打败的
阶段3:将剩余的队伍进行匹配

#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <fstream>#include <iostream>#include <list>#include <map>#include <queue>#include <set>#include <sstream>#include <stack>#include <string>#include <vector>#define MAXN 1100#define MAXE 210#define INF 10000000#define MOD 1000000007#define LL long long#define pi acos(-1.0)using namespace std;char str[MAXN][MAXN];vector<int> win;vector<int> lose;int main() {  std::ios::sync_with_stdio(false);  int n;  while (~scanf("%d", &n)) {    for (int i = 1; i <= n; ++i) {      scanf("%s", str[i] + 1);    }    win.clear();    lose.clear();    for (int i = 2; i <= n; ++i) {      if (str[1][i] == '1') {        win.push_back(i);      } else {        lose.push_back(i);      }    }    int m = n;    while (m >>= 1) {      vector<int> win2, lose2, final2;      for (int i = 0; i < lose.size(); ++i) {        bool flag = false;        for (int j = 0; j < win.size(); ++j) {          if (win[j] != -1 && str[win[j]][lose[i]] == '1') {            printf("%d %d\n", win[j], lose[i]);            win2.push_back(win[j]);            win[j] = -1;            flag = true;            break;          }        }        if (!flag) {          final2.push_back(lose[i]);        }      }      bool flag = false;      for (int i = 0; i < win.size(); ++i) {        if (win[i] != -1 && !flag) {          flag = true;          printf("1 %d\n", win[i]);          win[i] = -1;        } else if (win[i] != -1 && flag) {          final2.push_back(win[i]);        }      }      for (int i = 0; i < final2.size(); i += 2) {        printf("%d %d\n", final2[i], final2[i + 1]);        if (str[final2[i]][final2[i + 1]] == '1') {          if (str[1][final2[i]] == '1') {            win2.push_back(final2[i]);          } else {            lose2.push_back(final2[i]);          }        } else {          if (str[1][final2[i + 1]] == '1') {            win2.push_back(final2[i + 1]);          } else {            lose2.push_back(final2[i + 1]);          }        }      }      win = win2;      lose = lose2;    }  }  return 0;}/*4011000110000101080011101010101111000100100100010100110010101010110001000010101010*/
原创粉丝点击