luogu_p1129_矩阵游戏
题目描述
小 Q 是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏。矩阵游戏在一个
- 行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色)。
- 列交换操作:选择矩阵的任意两列,交换这两列(即交换对应格子的颜色)。
游戏的目标,即通过若干次操作,使得方阵的主对角线(左上角到右下角的连线)上的格子均为黑色。
对于某些关卡,小 Q 百思不得其解,以致他开始怀疑这些关卡是不是根本就是无解的!于是小 Q 决定写一个程序来判断这些关卡是否有解。
输入格式
本题单测试点内有多组数据。
第一行包含一个整数
第一行为一个整数,代表方阵的大小
接下来
输出格式
对于每组数据,输出一行一个字符串,若关卡有解则输出 Yes
,否则输出 No
。
样例 #1
样例输入 #1
1 | 2 |
样例输出 #1
1 | No |
xxxxxxxxxx52 1#include2using namespace std;34int n, a, b, c;56int main()7{8 cin >> n;9 cin >> a >> b >> c;10 if(a > b)11 swap(a, b);12 if(a > c)13 swap(a, c);14 if(b > c)15 swap(b, c);16 if((a + 1 == b && b + 1 == c) || (a == 0 && c == n - 1))17 {18 puts(“JMcat Win”);19 return 0;20 }21/22假如顶点连续,则代表这个黑色三角形在外面。23就像是一个多边形上连续三个点构成的三角形必然在外面24那么先手的野猫就赢了25当然还有一个特殊情况:假如黑色三角形同时包括 0 点和 n 点(首尾相连)26就比如:276280 5 4290 1 2302 4 3314 2 032所以要特判一下这种情况33/34 else if((n - 2) % 2 == 0)35 {36 puts(“JMcat Win”);37 return 0;38 }39/40假如黑色三角形被包在里面41先放着别的三角形不管42假设最后只剩三个个三角形包着黑三角43谁把其中一个三角切了谁就输了44胜负就出来了45所以只要考虑三角形个数的奇偶性就行了46/47 else48 puts(“PZ Win”);4950 return 0;51}52cpp
数据规模与约定
- 对于
的数据,保证 。 - xxxxxxxxxx44 1#pragma GCC optimize(2)2#include
3#include 4using namespace std;56#define N 2000207#define re register89int n, k, p;10int sum[N], money, style, is_low;11int nxt[N], head[N], after[N], st[N];12int ans;1314vector alls[55];1516int main()17{1819 scanf(“%d%d%d”, &n, &k, &p);20 for(re int i = 1; i <= n; i ++)21 {22 scanf(“%d%d”, &st[i], &money);23 if(money <= p)24 is_low = 1;25 else26 is_low = 0;27 sum[i] = sum[i - 1] + is_low;28 alls[style].push_back(i);29 }3031 for(int i = 1; i < n; i ++)32 {33 for(int j = i + 1; j <= n; j ++)34 {35 36 if(st[i] == st[j] && sum[j] - sum[i - 1] > 0)37 ans ++;38 }39 }4041 cout << ans << endl;4243 return 0;44}cpp - 对于
的数据,保证 , 。
分析
比赛时的想法是:每行每列只能平行移动,这就说明每一行和每一列必须要有一个方块,
然而只骗了20分
正解居然是二分图匹配!先回想一下二分图匹配的作用:匹配尽量多的边,使其形成一个二分图。二分图就是将所有的点分成两边,是这两部分内部没有边相连。
那这道题为什么是二分图匹配?例如一个点(1, 3)是 1,那他只有到(3, 3)才有用。那就是 1 匹配 3 。只有 n 条边匹配成功才视为形成一条斜线。所列哇 二分图匹配。
1 |
|