codeforces Round #677 (Div. 3) 1433B Yet Another Bookshelf

题目链接

在这里插入图片描述

题目翻译:

有一个能装n本书的书架。如果书架的第i个位置上有一本书,则ai=1,否则ai=0。题目保证书架上至少有一本书。
在一次移动中,你可以选择一段连续的区间[l;r],每个位置上都要有书(即对于任意i,l<=i<=r,ai=1都成立),然后:

  • 将区间向右移动一个位置:对于所有的下标i(l<=i<=r),把下标为i的书移动到下标为i+1的位置。只有当r+1<=n并且下标为r+1的位置上没有书的时候才可以移动。
  • 将区间向左移动一个位置:对于所有的下标i(l<=i<=r),把下标为i的书移动到下标为i-1的位置。只有当l-1>=1并且下标为l-1的位置上没有书的时候才可以移动。
    你的任务是计算出最小的移动次数使得书架上所有的书都是相邻的。
    比如,对于a=[0,0,1,0,1],下标3和5之间有0间隔。对于a=[1,1,0],a=[0,0,0],则没有间隔。
    你需要回答t个独立的测试用例。
解题思路:

显然,下标最小的1与下标最大的1之间0的个数就是需要移动的次数。
如果一开始一下子想不出来的话,可以用身边的东西简单模拟一下过程。

代码:
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cstdio>
#include<cmath>
#define inf 0x3f3f3f3f
using namespace std;
const int N = 100;
int a[N];
int main(){
    
    
//	freopen("1.txt","r",stdin);
	int t,n;
	cin>>t;
	while(t--){
    
    
		cin>>n;
		for(int i=0;i<n;i++){
    
    
			cin>>a[i];
		}
		int l,r;
		for(int i=0;i<n;i++){
    
    
			if(a[i]){
    
    
				l=i;
				break;
			}
		}
		for(int i=n-1;i>=0;i--){
    
    
			if(a[i]){
    
    
				r=i;
				break;
			}
		}
		int sum=0;
		for(int i=l;i<=r;i++){
    
    
			if(!a[i]) sum++;
		}
		cout<<sum<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lmmmmmmmmmmmmmmm/article/details/109220428