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 }

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com