B. Rule of League(思维)

题目

题意

给定n,有n个选手。
一开始,
1号选手与2号选手比赛。角逐出胜者;
接着,上一局胜者与3号选手比赛。角逐出胜者;
接着,上一局胜者与4号选手比赛。角逐出胜者;
.。。。
一直到最后,角逐出最终胜者。

现在,已知每个选手要么赢了x场,要么赢了y场。

根据n,x,y,构造每场的胜利者。如果无法构造,则输出-1。

思路

不妨令x 显然,x一定为0。因为第1场,肯定有人输。
其次,剩余选手都需要刚好赢y场。

代码

#include
using namespace std;
#define ll long long
#define all(x) (x).begin(), (x).end()
const int maxn = 200010;
#define inf 1e18

int n, x, y;
void solve() {
 scanf("%d%d%d", &n, &x, &y);
 if (x > y) {
  swap(x, y);
 }
 
 if (x || (!y || (n - 1) % y)) {
  printf("-1\n");
  return;
 }
 
 for (int i = 2; i <= n; i += y) {
  int p = y;
  while (p--) {
   printf("%d ", i);
  }
 }
 printf("\n");
}

int main() {
 int t;
 scanf("%d", &t);
// t = 1; 
 while (t--) {
  solve();
 }
}

你可能感兴趣的:(Codeforces,算法,图论,c++)