1 solutions
-
0
这个题可以现在草稿本上做一下。
然后你会发现,不论如何移动,最终步数都相等。
(“移动”指的是有效移动,即如果发现有一个1与一个0相邻,且1在前,0在后,就交换它们的位置)
所以我们可以统一用同一种方法移动。
方法:从头到尾遍历序列,只要发现一个0,就将它移到最前面。
例如:
0 1 0 1 0 1 (原序列)
0 1 0 1 0 1 (第一轮交换,0本身在最前面,用了0步)
0 0 1 1 0 1 (第二轮交换,用了1步)
0 0 0 1 1 1 (第三轮交换,用了2步)
我们发现,每一次交换,步数都是前面的0和后面的0中间1的个数。
0 1 0 1 0 1 (第二轮交换,用了1步)
0 0 1 1 0 1 (第三轮交换,用了2步)
那么我们如何统计他们之间1的个数呢?
我们只需要确定他们的起点(前面的0)和终点(后面的0)。
起点最初是0,每交换一轮,起点+1;
终点就是遍历时遇到的0。
注意:我们统计的是两个0之间1的个数,所以他们相减后还要再减1.
代码如下:
#include<bits/stdc++.h> using namespace std; int main(){ string a; int start=0; long long sum=0; cin>>a; for(int i=0;i<a.length();i++){ if(a[i]=='0'){ sum+=(i+1)-start-1; start++; } } cout<<sum; return 0; }
- 1
Information
- ID
- 607
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 7
- Tags
- # Submissions
- 30
- Accepted
- 9
- Uploaded By