Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) D. Sorting the Coins

http://codeforces.com/contest/876/problem/D

题意:

最开始有一串全部由“O”组成的字符串,现在给出n个数字,指的是每次把位置n上的“O”变为“X”,之后会进行扫描。

扫描的规则是如果遇到一个字符为“X”并且这个字符后面的字符为“O”,那么就交换。

如果哪一次扫描没有发生交换,那么扫描就停止。

现在给出的n个数字,问第一次需要扫描多少次,第二次需要扫描多少次。。。。第n+1次需要扫描多少次(第一次指的是全部都是“O”,还没有替换为“X”)。

思路:

每一次,只需要统计下标最大的“O”之前有多少个“X”即可,用了一种十分巧妙的方式:

一开始最大下标位置在n,之后每一次替换就把这个位置占领了,之后判断最大下标的位置是否被占领,如果被占领就一直把最大位置下标递减,同时减去已经有的“X”的数量(后面的“X”没有移动,所以要减去)。

之后输出还有的“X”的数量加1即可(加一是最后还要扫一遍)。

代码:

 1 #include <stdio.h>
 2 
 3 bool a[300005];
 4 
 5 int main()
 6 {
 7     int n;
 8 
 9     scanf("%d",&n);
10 
11     printf("1 ");
12 
13     int cnt = 0;
14 
15     int k = n;
16 
17     for (int i = 1;i <= n;i++)
18     {
19         int t;
20 
21         scanf("%d",&t);
22 
23         a[t] = 1;
24 
25         cnt++;
26 
27         while(a[k])
28         {
29             k--;
30             cnt--;
31         }
32 
33         if (i != n) printf("%d ",cnt + 1);
34         else printf("%d",cnt+1);
35     }
36 
37     printf("
");
38 
39     return 0;
40 }
原文地址:https://www.cnblogs.com/kickit/p/7680720.html