CodeForces 669D Little Artem and Dance(思维)

题目链接:点击打开链接

题意:有n对男女生跳舞,都是从1到n编号,1号男生和1号女生配对、2号男生和2号女生配对......n号男生和n号女生配对。配对的男女生按照编号从小到大顺时针围成一圈。 
有两种操作,
均是只移动男生: 
1.将所有男生都移动x位(x > 0时顺时针移动;x < 0时逆时针移动)。
2.将所有位置两两相邻的男生换位,举个例子,1、2位置的男生交换,3、4位置的男生交换,......,n - 1、n位置的男生交换。

问q次操作后,从1到n输出与所有女生配对的男生编号。

思路:用到的思维是,可以推出所有奇数编号和偶数编号的男生的相对顺序都不变,所以只需要记录编号为1和2男生的位置就可以了,剩下男生的位置可以递推出来。男女生围成了一个圈,用类似于循环数组的思路用两个变量去模拟男生位置的变化,男生的位置从0开始计算比较方便统一。

// CodeForces 669D Little Artem and Dance 运行/限制:842ms/2000ms
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int pos[1000005];
int main(){
	int n, q, oper, move;
	int loc1, loc2;//1号男孩位置,2号男孩位置
	while (scanf("%d%d", &n, &q) != EOF) {
		loc1 = 0, loc2 = 1;//为了计算方便同意,位置从0开始,即初始1号男孩在0位置
		for (int i = 0; i < q; i++) {
			scanf("%d", &oper);
			if (oper == 1) {
				scanf("%d", &move);
				loc1 = (loc1 + move + n) % n;//防止位置为负数,加n
				loc2 = (loc2 + move + n) % n;
			}
			else {
				//0、1位置的男孩交换,2、3位置的男孩交换,......,n - 2、n - 1位置的男孩交换
				//其实相当于偶数位置男孩后移一位,奇数位置男孩前移一位
				if (loc1 & 1) {//1号男孩在奇数位置(这时2号男孩一定在偶数位置)
					loc1 = (loc1 - 1 + n) % n;
					loc2 = (loc2 + 1) % n;
				}
				else {//1号男孩在偶数位置(这时2号男孩一定在奇数位置)
					loc1 = (loc1 + 1) % n;
					loc2 = (loc2 - 1 + n) % n;
				}
			}
		}
		for (int i = 1; i <= n; i += 2) {
			pos[loc1] = i;
			pos[loc2] = i + 1;
			loc1 = (loc1 + 2) % n;
			loc2 = (loc2 + 2) % n;
		}
		for (int i = 0; i < n; i++) {
			printf("%d%c", pos[i], i == n - 1? '\n' : ' ');
		}
	}
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值