农夫约翰有一条长度为 L 的绳子,可用于农场周围的各种任务。
绳子在不同的位置有 N 个绳结,包括两个端点处各有一个。
约翰注意到,在某些位置,他可以将绳子对折,这样,相对的绳索上的绳结就可以彼此完全对齐:
请帮助约翰统计具有此属性的折叠点数。
允许在某个绳结处折叠,但不允许在端点绳结处折叠。
折叠后,较长的一侧可以有多余节点。
输入格式
第一行包含两个整数 N 和 L。
接下来 N 行,每行包含一个 0∼L 范围内的整数,表示一个绳结的位置。其中两行包含的数字分别是 0 和 L。
输出格式
输出有效折叠位置的数量。
数据范围
1≤L≤10000,
1≤N≤100
输入样例:
5 10
0
10
6
2
4
输出样例:
4
样例解释
有效折叠位置为1,2,3,8。
代码:
// 判断每个结点和 两个结点中间 是否可以当作对折点
#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int a[N];
int n, m;
bool check(int l, int r)
{
for (int i = l, j = r; i >= 0 && j <= n - 1; i--, j++)
{
if (a[l] - a[i] != a[j] - a[r])
return false;
}
return true;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n);
int res = 0;
// 从当前结点向两边出发
for (int i = 1; i < n - 1; i++)
{
if (check(i, i))
res++;
}
// 中间点可能是分数 所以分别将左右两结点作为出发点来判断
for (int i = 1; i < n; i++)
{
if (check(i - 1, i))
res++;
}
cout << res << endl;
return 0;
}