题目描述
FJ 有一个长度为 L(1≤L≤10,000)的绳子。这个绳子上有 N(1≤N≤100)个结,包括两个端点。FJ 想将绳子对折,并使较短一边的绳子上的结与较长一边绳子上的结完全重合,如图所示:
找出FJ有多少种可行的折叠方案。
输入格式
第一行:两个整数,N 和 L。
第 2 至 N+1 行:每一行包含一个整数表示一个结所在的位置,总有两个数为 0 和 L。
输出格式
第一行: 一个整数表示FJ可折叠的方案数。
输入输出样例
输入 #1
5 10 0 10 6 2 4
输出 #1
4
说明/提示
(可在 1,2,3,8 点处折叠)
思路
标记可以折叠的方案的数量。
完整代码
#include<bits/stdc++.h>
using namespace std;
int n,L;
bool used[20005];
bool check(int l,int r,int mid){while (l>=0 && r<=L){while (!used[l]) l--;while (!used[r]) r++;if (l>=0 && r<=L){if (abs(l-mid)!=abs(r-mid)) return 0;l--;r++;}}return 1;
}
int main(){cin>>n>>L;//freopen("a.in","r",stdin);L*=2;for (int i=1;i<=n;i++){int x;cin>>x;x*=2;used[x]=1;}int ans=0;for (int i=1;i<L;i++){int l=i-1,r=i+1;if (check(l,r,i) && i/2<L/2){ans++;} }cout<<ans<<endl;//freopen("b.out","w",stdout);return 0;}