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即可(加一是最后还要扫一遍)。
代码:
#include <stdio.h> bool a[]; int main()
{
int n; scanf("%d",&n); printf("1 "); int cnt = ; int k = n; for (int i = ;i <= n;i++)
{
int t; scanf("%d",&t); a[t] = ; cnt++; while(a[k])
{
k--;
cnt--;
} if (i != n) printf("%d ",cnt + );
else printf("%d",cnt+);
} printf("\n"); return ;
}