El círculo núcleo
En realidad, es un problema muy simple, primero enumerar toda la disposición.
bool work(int l,int r){
int maxn=INT_MIN,minn=INT_MAX;
for(int i=l;i<=r;i++)maxn=max(maxn,f[i]),minn=min(minn,f[i]);
return maxn-minn==r-l;
}
Aprendido \ (STL \) se sabe. Después de eso, nos fijamos en la forma de escribir \ (control \) se
Mi enfoque relativamente violencia, \ (1 \) a \ (n \) que barrer, cada uno con su mayor punto de buscar el final del segmento más largo y continuo.
bool check(){
for(int i=1;i<=n;i++){
……
}return true;
}
¿Cómo encontrarlo, tengo más práctica de habilidades
de la siguiente manera
Hemos identificado el punto correcto, a continuación, enumero la violencia apuntar hacia la izquierda, la pregunta ahora se transforma en, cómo juzgar segmentos consecutivos.
bool check(){
for(int i=1;i<=n;i++){
int ans;
for(int j=1;j<=i;j++)
if(work(j,i)){
ans=i-j+1;
break;
}
if(ans!=a[i])return false;
}return true;
}
Cómo determinar un segmento continuo de ello, todavía tengo más práctica de habilidades
de la siguiente manera
Debido a que el número de secuencia no se repite, por lo que, nos encontramos con los valores máximos y mínimos a este período, ver su diferencia \ (1 + \) no es igual a la longitud de la secuencia, es decir, \ (r-l + 1 \ ) .
bool work(int l,int r){
int maxn=INT_MIN,minn=INT_MAX;
for(int i=l;i<=r;i++)maxn=max(maxn,f[i]),minn=min(minn,f[i]);
return maxn-minn==r-l;//等式两边都减1
}
\(código:\)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<typename T>inline void read(T &FF){
T RR=1;FF=0;char CH=getchar();
for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1;
for(;isdigit(CH);CH=getchar())FF=(FF<<1)+(FF<<3)+(CH^48);
FF*=RR;
}
const int MAXN=15;
int a[MAXN],f[MAXN],n,ans;
bool work(int l,int r){
int maxn=INT_MIN,minn=INT_MAX;
for(int i=l;i<=r;i++)maxn=max(maxn,f[i]),minn=min(minn,f[i]);
return maxn-minn==r-l;
}
bool check(){
for(int i=1;i<=n;i++){
int ans;
for(int j=1;j<=i;j++)
if(work(j,i)){
ans=i-j+1;
break;
}
if(ans!=a[i])return false;
}return true;
}
int main(){
read(n);
for(int i=1;i<=n;i++)read(a[i]),f[i]=i;
do{
if(check())ans++;
}while(next_permutation(f+1,f+n+1));
cout<<ans;
return 0;
}