• 核心法阵


    核心法阵

    其实就是一道很简单的题目,我们先枚举全排列。

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

    学过 (STL) 的一个都知道。之后,我们来看如何写 (check)

    我的做法比较暴力,(1)(n) 得去扫,每个点去找最大的以它结尾最长的连续段。

    bool check(){
        for(int i=1;i<=n;i++){
            ……
        }return true;
    }
    

    如何找呢,我的做法比较有技巧

    如下

    我们已经确定了右端点,然后,我暴力枚举左端点,现在问题就转换成了,如何判断连续段。

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

    如何判断连续段呢,我的做法依然比较有技巧

    如下

    因为这个序列是没有重复数字的,所以,我们去对这一段找最大值和最小值,看它们的差 (+1) 是不是等于序列的长度,也就是 (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
    }
    

    (code:)

    #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;
    }
    
  • 相关阅读:
    mysql中cast() 和convert()的用法讲解
    li内有span需要右浮的问题
    svn检出项目
    vue中的 ref 和 $refs
    for in 循环 和for循环 for of循环
    setInterval()、clearInterval()、setTimeout()和clearTimeout() js计数器方法(还有第三个参数)
    利用history.pushState()实现页面无刷新更新
    函数isNaN() parseFloat() parseInt() Math对象
    一个关于margin-top的问题
    vue 父子组件之间传参
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/12518890.html
Copyright © 2020-2023  润新知