1 solutions

  • 0
    @ 2024-11-15 14:40:47

    这个题可以现在草稿本上做一下。

    然后你会发现,不论如何移动,最终步数都相等。

    (“移动”指的是有效移动,即如果发现有一个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