ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

题解 P1091 【合唱队形】

2019-05-02 12:49:24  阅读:231  来源: 互联网

标签:合唱队 int 题解 top mid else P1091 include 单调


思路:分别求出单调上升和单调下降的序列长度,然后直接求出答案。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N=105;
int n,top,ans,a[N],s[N],f[3][N];
int main()
{
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
        scanf("%d", &a[i]);
    //单调上升 
    for(int i=1; i<=n; i++)
    {
        if(a[i] > s[top])//如果可以保持单调性就插入栈 
        {
            s[++top] = a[i];
            f[0][i] = top;
        }else //否则寻找栈里的数替换 
        {
            int L = 1,R = top;
            while(L < R)//二分求出要替换的数,
            {
                int mid = (L + R) / 2;
                if(s[mid] < a[i]) L = mid + 1;else R = mid;
            }
            s[R] = a[i];//R为要替换数的位置 
            f[0][i] = top;//记录下栈的长度 
        }
    }
    top = 0;
    memset(s,0,sizeof(s));
    //单调下降,操作类似于单调上升 
    for(int i=n; i>=1; i--)
    {
        if(a[i] > s[top])
        {
            s[++top] = a[i];
            f[1][i] = top;
        }else
        {
            int L = 1,R = top;
            while(L < R)
            {
                int mid = (L + R) / 2;
                if(s[mid] < a[i]) L = mid+1;else R = mid;
            }
            s[R] = a[i];
            f[1][i] = top;
        }
    }
    for(int i=1; i<=n; i++)
        ans = max(ans, f[0][i] + f[1][i] - 1);//答案为单调上升加上单调下降再减去多加的一个 
    printf("%d", n - ans);//减去留在队列里的数字即为答案 
    return 0;
}

标签:合唱队,int,题解,top,mid,else,P1091,include,单调
来源: https://www.cnblogs.com/N-S-P/p/10802062.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有