• 核心法阵


    核心法阵

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

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

    学过 STLSTL 的一个都知道。之后,我们来看如何写 checkcheck

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

    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+1 是不是等于序列的长度,也就是 rl+1r-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: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;
    }
    
  • 相关阅读:
    发布在Xilinx 嵌入式系统中文论坛的旧帖子
    【分享】MPSoC,XEN虚拟机运行裸核应用程序(baremetal, standalone)的中断延迟
    【分享】 在Vivado里关闭R5/GPU,降低Xilinx MPSoC的功耗
    python实现单链表
    Flink 作业问题分析和调优实践
    flink 有状态 udf引发的大坑一
    flink checkpoint 在 window 操作下 全局配置失效的问题
    python实现十大经典排序算法
    Flink on yarn 常见错误
    搭建Spark所遇过的坑
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/12817031.html
Copyright © 2020-2023  润新知