奇/偶排列问题

D - Swap Hats

添加链接描述

题意:
给定R G B三个字母的排序,问通过恰好 1 e 18 1e18 1e18次交换操作,能否将其变成给定的顺序?

分析:

1.令R=1,G=2,B=3,我们可以将其转化为(1,2,3)排列问题
请添加图片描述

2.A组的三种排列可以通过一次操作变成B组中的排列,同理,B组中的三种排列也可以通过一次操作变成A组中的排列。如果A组中的一种排列要变成他相同组中的另一种排列,需要两次操作(先变成B排列,再变回A)。综上我们可以知道:通过偶数1e18次操作,如果两种排列在同一组中,就可以得到。

延伸:

  1. 奇排列表示序列中逆序对为奇数的序列,偶排列表示序列中逆序对为偶数的序列。
  2. 奇排列可以通过一次操作变成偶排列,偶排列可以通过一次操作变成奇排列。
  3. 相同类型的排列相互转化要进行偶数次操作:奇排列如果变成奇排列要进行偶数次操作,偶排列如果变成偶排列要进行偶数次操作。
  4. 所以如果进行偶数次操作,无论如何都不能变成另一种类型的排列。

结合本题:
上图中的A组其实就是偶排列(逆序对为偶数),B组其实就是奇排列(逆序对数量为奇数)。所以题目给定 1 e 18 1e18 1e18次操作,即偶数次操作,只能在同一组中进行相互转化。所以直接判断输入的两种排列是否在同一组中。

bool f(string s)
{
	return (s=="R G B"||s=="G B R"||s=="B R G");
}
int main()
{
	string s1,s2;
	getline(cin,s1);
	getline(cin,s2);
	if(f(s1)==f(s2)) puts("Yes");
	else puts("No");
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值