zoukankan      html  css  js  c++  java
  • 核心法阵

    核心法阵

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

    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;
    }
    
  • 相关阅读:
    HDU 4705 Y
    POJ 3614 Sunscreen
    Aizu 2170 Marked Ancestor
    POJ 3616 Milking Time
    POJ 2385 Apple Catching
    POJ 2229 Sunsets
    HDU 4678 Mine
    树的重量
    579Div3
    迷途之家2019联赛
  • 原文地址:https://www.cnblogs.com/zhaohaikun/p/12518890.html
Copyright © 2011-2022 走看看