P17174 「MSOI R1」距离 题解

题目大意

有 \(N\) 个人站成一排,给你每个人两两之间的距离。然后有些人有强迫症,和其相邻的两人必须与他的距离相同,保证两侧的人没有强迫症。我们可以调整有强迫症的人的位置,问最少需要调整多少个有强迫症的人的位置才能使没有人犯强迫症。

算法分析

首先设第一个人的位置为 \(0\),然后处理出后面每个人的位置。

然后找到每一块连续强迫症患者,然后如果要满足他们的所有要求的话就必须让他们两两间的空隙全部相同。还因为初始位置一定是整数,所以还要判断这个距离是不是整数,然后就判一下有几个人不在对应位置上,最后答案就是不在对应位置上的人数总和。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
long long d[N];
bool t[N];
int main(){
  ios::sync_with_stdio(0);
  cin.tie(0),cout.tie(0);
  int n;cin>>n;
  for(int i=1;i<n;i++){
    cin>>d[i];
  }
  for(int i=n;i>=1;i--){
    d[i]=d[i-1];
  }
  for(int i=2;i<=n;i++){//处理位置
    d[i]+=d[i-1];
  }
  for(int i=1;i<=n;i++)cin>>t[i];
  int ans=0;
  for(int i=2;i<n;i++){
    if(!t[i])continue;//如果没有强迫症
    int num=1;
    for(int j=i+1;j<n;j++){//往后寻找连续强迫症患者
      if(!t[j])break;
      num++;
    }
    for(int j=i;j<=i+num-1;j++){//枚举
      if((d[i+num]-d[i-1])%(num+1)!=0||d[j]-d[j-1]!=(d[i+num]-d[i-1])/(num+1)){
 //(d[i+num]-d[i-1])%(num+1)为距离
        d[j]=d[j-1]+(d[i+num]-d[i-1])/(num+1);//记得更新
        ans++;
      }
    }
    i=i+num;//直接跳过
  }
  cout<<ans;
}
posted @ 2026-10-17 18:54  SCX2014  阅读(2)  评论(0)    收藏  举报