您的位置:首页 > 其它

CodeForces 669D Little Artem and Dance(思维)

2017-11-27 20:00 281 查看
题目链接:点击打开链接

题意:有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: