El círculo núcleo

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;
}

Supongo que te gusta

Origin www.cnblogs.com/zhaohaikun/p/12518890.html
Recomendado
Clasificación