题意分析
把每一个牛都看图中的点,把牛和另一个传球对象之间看成一条边,
这么来想的话
图中会出现环,并且环的长度必定是两个顶点
图中每个点的入度最小为零(顶点的两头牛),最大为二(左右都给他)
然后图中就会出现两种环
一种是不带树的环,一种是基环树
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int INF = 1e9;
int p[120]; // 储存位置
int go[120]; // 储存下个位置
int d[120]; // 记录每个点的入度
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i ++) cin >> p[i];
p[0] = -INF, p[n + 1] = INF;
sort(p + 1, p + 1 + n);
for(int i = 1; i <= n; i ++)
{
if(p[i] - p[i - 1] <= p[i + 1] - p[i])
{
go[i] = i - 1;
d[i - 1] ++; // 入度加一
}
else
{
go[i] = i + 1;
d[i + 1] ++; // 入度加一
}
}
int res = 0;
for(int i = 1; i <= n; i ++)
{
if(!d[i]) res += 2;
else if(go[go[i]] == i && d[i] == 1 && d[go[i]] == 1) res ++;
}
cout << res / 2 << endl;
return 0;
}