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

时间:2023-03-09 04:27:30
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即可(加一是最后还要扫一遍)。

代码:

 #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 ;
}