题解:B4174 [BCSP-X 2024 6 月初中组] 厂房
此题为万恶のBCSP-X上半年比赛初中组第一题,难度已经接近黄级。不得不说这道题思路不仅有一定难度,坑点也不少,啊啊啊。
鄙人当年作为北京市一名普通の初中生现场参加过这场比赛的复赛,赛时还是成功A了这道题,所以谨以此篇题解。不过很险的是鄙人在最后
言归正传。此题的正解思路就是先将相邻两个机器人的质量作差,将所得结果的绝对值用一个数组
需要注意的坑点有两个:一是每次不仅要判断最大公约数是否为
以上两点,第一点用set查重,第二点特判即可。
下面附上本人赛时满分代码(算上查重,时间复杂度为
#include<iostream>
#include<cmath>//abs()
#include<algorithm>//__gcd()
#include<set>
using namespace std;
const int N=1e5+5;
int n,a[N],d[N],ans=1;//默认至少有一个家族,所以ans初值赋为1
set<int> st;//用来查重
int main()
{
cin>>n;
if(n==1)//此参考代码的逻辑对于n=1不会输出1,所以需要特判
{
cout<<1;
return 0;
}
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
d[i]=abs(a[i+1]-a[i]);//初始化d数组
int gcd=d[1];
st.insert(a[1]);
if(gcd<=1)//特判第一个机器人的家族里是否只有它自己一个“人”
{
ans++;
st.clear();
gcd=d[2];
}
st.insert(a[2]);
for(int i=2;i<n;i++)
{
gcd=__gcd(gcd,d[i]);//不断gcd
if(gcd<=1||st.count(a[i+1]))//判断是否需要断开
{
ans++;
st.clear();
gcd=d[i+1];
}
st.insert(a[i+1]);
}
cout<<ans;
return 0;
}