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;
}
题意:有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;
}
相关文章推荐
- Codeforces 353D Queue【思维】好题~
- CodeForces 288C - Polo the Penguin and XOR operation(思维)
- Codeforces-199D:Jumping on Walls(DFS+思维)
- Codeforces 844B - Rectangles - 思维
- Codeforces-891B Gluttony 思维题
- Codeforces 551C GukiZ hates Boxes【二分+思维处理】好题!
- CodeForces 626D Jerry's Protest+思维题
- codeforces 580B Arpa and a list of numbers 前缀和+思维+分块 (调和级数)
- codeforces-660【思维】
- CodeForces - 819B Mister B and PR Shifts(线性dp+思维)
- CodeForces 554B Ohana Cleans Up(思维)
- Codeforces 570B Simple Game 概率求解,简单数学思维
- codeforces 814B An express train to reveries(思维)
- codeforces 777D. Cloud of Hashtags (逆序思维)
- CodeForces 761D Dasha and Very Difficult Problem (数学分析,思维)
- Codeforces 115 B Lawnmower【思维】
- 【CodeForces】--- New Year's Eve(思维)
- codeforces 552C Vanya and Scales 【思维】
- Codeforces 782C Andryusha and Colored Balloons【思维+Dfs暴力染色】
- codeforces 361B 思维题