AcWing 2031. 折叠绳子--------->前缀和+枚举
原题链接
简单
作者:
cyuyu
,
2022-05-05 19:38:21
,
所有人可见
,
阅读 136
//最多只允许一端有多余的点,另外一端的点一定是全部可以对齐的!
#include<iostream>
using namespace std;
const int N=20020;
int a[N],b[N];
int main(){
int n,l;
cin>>n>>l;
int t=n;
while(t--){
int i;
cin>>i;
a[2*(i+1)]=1;
}//下标从2开始,最后一个点的位置为2*(l+1)
for(int i=1;i<=2*(l+1);i++){
b[i]=b[i-1]+a[i];
}
int ans=0;
int flag=1;
int sum=0;
int j=0;
for(int i=3;i<2*(l+1);i++){
flag=0;
int temp=min(i-2,2*(l+1)-i);
for( j=0;j<=temp;j++){
if(a[i-j]!=a[i+j]){
flag=1;
}
}
if(!flag){
if(b[i-j]!=0&&b[2*(l+1)]-b[i+j-1]!=0){
ans=ans;
}
else{
ans++;
// cout<<i<<endl;
}
}
}
cout<<ans<<endl;
return 0;
}
//问题:节点可以在任意位置,小数也可以,那么怎么表示呢?
//将每一个点都变成原来的二倍就好了!
//如果是小数,那么一定是k+0.5,不会出现0.3,0.4,无理数等情况