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

it2025-03-26  10

题意: 书架上有很多书,1代表此位置有书,0没有书。每次可以抱一摞书移动一个格子。 (一摞书,多少都可以,连续的1视为一摞) 问最少多少次移动可以把所有的书归为一摞。 题解: 可以移动连续的书 所以答案就是1中间0的数量 双指针遍历即可 code:

#include<bits/stdc++.h> //#pragma GCC optimize(2) #define rep(i,a,n) for (int i=a;i<=n;i++)//i为循环变量,a为初始值,n为界限值,递增 #define per(i,a,n) for (int i=a;i>=n;i--)//i为循环变量, a为初始值,n为界限值,递减。 using namespace std; #define IOS ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0) #define ll long long #define ull unsigned long long #define ld long double #define PII pair<int,int> #define debug(a) cout <<#a << "=" << a << endl; const int INF = 0x3f3f3f3f; const ll LINF = 1ll<<60; const int mod=1e9+7; inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;} int main(){ int t; cin>>t; while(t--){ int n,a[55]; cin>>n; rep(i,1,n) cin>>a[i]; int l=0,r=0; int ans=0; for(int i=1,j=1;i<=n;i++){ while(j<i&&(a[j]==0)){ j++; } if(a[i]==1&&a[j]==1){//注意条件 if(i!=j) ans+=i-j-1; j=i;//更新 } } cout<<ans<<endl; } return 0; }
最新回复(0)