AcWing 1738. 蹄球
打卡
参考
竟然是拓扑排序,没想到哇。
有入度的点不会做起点。
#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
const int N=1e2+10;
int n,ans;
int a[N],b[N],rd[N];//入度
int v[N];
void dfs(int u)
{
v[u]=1;
if(!v[b[u]]) dfs(b[u]);//u能走到的地方没走过
}
int main()
{
cin>>n;
fir(i,1,n) cin>>a[i];
sort(a+1,a+1+n);
b[1]=2;b[n]=n-1;//初始化
for(int i=2;i<=n-1;i++)
{
if(abs(a[i]-a[i-1])<=abs(a[i+1]-a[i])) b[i]=i-1;//要往左走
else b[i]=i+1;
}
for(int i=1;i<=n;i++)
{
if(b[i]) rd[b[i]]++;
}
fir(i,1,n)
{
if(!rd[i]) //没有球会传给它 所以只有它来传球
{
ans++;dfs(i);
}
}
fir(i,1,n)
{
if(!v[i])//竟然这个地方没走过 那就给个球
{
ans++;dfs(i);
}
}
cout<<ans;
return 0;
}