UVa 133 The Dole Queue

  循环队列,本来要用链表模拟,可是因为是同时删除两个节点,而在模拟时后删除的节点可能会影响先删除的节点(删除第一个节点后指针指向下一个节点,而该节点如果是要删除的第二个节点的话指针还要移动),感觉有点麻烦,就用数据模拟了,反正数据也不大。

  代码如下:

View Code
 1 #include <cstdio>
 2 using namespace std;
 3 
 4 const int maxn = 25;
 5 int a[maxn];
 6 int size;
 7 
 8 int main()
 9 {
10 #ifdef LOCAL
11     freopen("in", "r", stdin);
12 #endif
13     int n, k, m;
14     while(scanf("%d%d%d", &n, &k, &m) != EOF && !(!n && !k && !m))
15     {
16         int first = 1;
17         for(int i = 0; i < n; i++)
18             a[i] = i+1;
19         size = n;
20         int p = n-1, q = 0;
21         while(size > 0)
22         {
23             for(int cnt = 0; cnt < k; )
24             {
25                 p = (p+1)%n;
26                 if(a[p])   cnt++;
27             }
28             for(int cnt = 0; cnt < m; )
29             {
30                 q = (q-1+n)%n;
31                 if(a[q])   cnt++;
32             }
33             if(first)   first = 0;
34             else printf(",");
35             if(p == q)
36             {
37                 printf("%3d", a[p]);
38                 a[p] = 0;
39                 size--;
40             }
41             else 
42             {
43                 printf("%3d%3d", a[p], a[q]); 
44                 a[p] = a[q] = 0;
45                 size -= 2;
46             }
47         }
48         printf("\n");
49     }
50     return 0;
51 }

  开始把int first = 1; 写到最外面了,结果后面的输出每行都是以一个逗号开头,让我WA的不明不白,后来突然发现了这个问题。一直用它给的样例测试,看来以后如果只给一个样例输入的话,还是要多测试一下的,不能太懒了,多复制粘贴几下也好啊,最起码也有了好几组数据呢。

原文地址:https://www.cnblogs.com/xiaobaibuhei/p/3026383.html