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("\n"); 38 39 return 0; 40 }
康复训练中~欢迎交流!