1101---递归求解

来源:互联网 发布:感恩节的由来 知乎 编辑:程序博客网 时间:2024/06/06 02:02

题目内容
题目见链接:https://www.patest.cn/contests/pat-a-practise/1101
题目分析
1.题目不难,求可能出现的轴值个数和轴值,但是暴力解法超时,只能得18分(见代码1)
2.利用动态规划,设置两个数组,一个Min,一个Max,分别表示0-i的最大值和i-最后的最小值(见代码2)
题目代码1

#include <iostream>#include <vector>#include <stdio.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std; int main(int argc, char *argv[]) {    int n;    cin>>n;    int num[n];    vector<int> res;//存储结果     for(int i=0;i<n;i++){        scanf("%d",&num[i]);    }    bool flag = true;    for(int i=0;i<n;i++){//暴力解法         int t = num[i];        flag = true;        for(int j=0;j<i;j++){            if(num[j]>=t){                flag = false;                break;            }        }        if(flag){            for(int j=i+1;j<n;j++){                if(num[j]<=t){                    flag = false;                    break;                }            }        }        if(flag){            res.push_back(t);        }    }    int size = res.size();    if(size==0){        printf("0\n");        printf("\n");    }    else{        cout<<size<<endl;        cout<<res[0];        for(int i=1;i<size;i++){            printf(" %d",res[i]);        }    }    return 0;}

题目代码2

#include <iostream>#include <vector>#include <stdio.h>/* run this program using the console pauser or add your own getch, system("pause") or input loop */using namespace std; const int MAX = 100000+5;int num[MAX],Min[MAX],Max[MAX];/**    Min[i]表示0-i最大值     Max[i]表示i-最后最小值*/ int main(int argc, char *argv[]) {    int n;    cin>>n;    vector<int> res;    for(int i=0;i<n;i++){        scanf("%d",&num[i]);    }    bool flag = true;    Min[0]=num[0];    Max[n-1]=num[n-1];    //递归求解     for(int i=1;i<n;i++){        int t = num[i];        if(t>Min[i-1]){            Min[i]=t;        }        else{            Min[i]=Min[i-1];        }               }    for(int i=n-1;i>=0;i--){        if(num[i-1]<Max[i]){            Max[i-1]=num[i-1];        }        else{            Max[i-1]=Max[i];        }    }    for(int i=0;i<n;i++){        if(num[i]<=Max[i]&&num[i]>=Min[i]){            res.push_back(num[i]);        }    }    int size = res.size();    //第一行输出0,第二行输出空行     if(size==0){        printf("0\n");        printf("\n");    }else{        printf("%d\n",size);        printf("%d",res[0]);        for(int i=1;i<size;i++){            printf(" %d",res[i]);        }    }    return 0;}
原创粉丝点击