CodeForces 669D(小思维+负数取模)
题目链接:http://codeforces.com/problemset/problem/669/D
题意:q次按顺序操作,操作1:整体移动给定单位距离;操作2:奇偶位互换,要求输出q次操作后的情况
思路:不管是整体移动还是奇偶互换,所有的奇数之间的相对位置是不变的,这也意味着所有的偶数相对位置也是不变的。(1后两位是3,3后两位是5;2后两位是4,4后两位是6……依此类推)
代码:
1 #include<stdio.h> 2 3 const int maxn = 1e6 + 10; 4 int num[maxn]; 5 int n, q; 6 int op, step; 7 int pos1, pos2; //记录数字1的位置和数字2的位置 8 9 int main() 10 { 11 while(scanf ("%d %d", &n, &q) != EOF) 12 { 13 pos1 = 0; 14 pos2 = 1; //初始位置 15 while(q--) 16 { 17 scanf("%d", &op); 18 if(op == 1) //整体移动 19 { 20 scanf("%d", &step); 21 pos1 = ((pos1 + step) % n + n) % n; 22 pos2 = ((pos2 + step) % n + n) % n; 23 } 24 else //奇偶交换 25 { 26 int dis1 = pos1 % 2 ? -1 : 1; //数组下标代表位置,下标从0开始 27 int dis2 = pos2 % 2 ? -1 : 1; //奇数位前移+1,偶数位后移-1 28 pos1 = ((pos1 + dis1) % n + n) % n; 29 pos2 = ((pos2 + dis2) % n + n) % n; 30 } 31 } 32 for(int i = 0; i < n; i += 2) 33 { 34 num[(i + pos1) % n] = i + 1; 35 num[(i + pos2) % n] = i + 2; 36 } 37 for(int i = 0; i < n - 1; i++) 38 { 39 printf("%d ", num[i]); 40 } 41 printf("%d\n", num[n - 1]); 42 } 43 return 0; 44 }
小问题:
1、用cin和cout会TLE;
2、(a + b) % n 与 ((a + b) % n + n) % n是有区别的,后者可处理负数问题
负数取模:(参考博客:https://blog.csdn.net/creat2012/article/details/17999929
//n = 10
5 2 (a + b) % n: 7 ((a + b) % n + n) % n: 7 -5 2 (a + b) % n: -3 ((a + b) % n + n) % n: 7 5 -2 (a + b) % n: 3 ((a + b) % n + n) % n: 3