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

 

posted @ 2018-07-24 14:47  Piccolo_Devil  阅读(174)  评论(0编辑  收藏  举报