社区讨论

70分,求大佬挑错。。。

P1091[NOIP 2004 提高组] 合唱队形参与者 4已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mi6udkc9
此快照首次捕获于
2025/11/20 10:58
4 个月前
此快照最后确认于
2025/11/20 10:58
4 个月前
查看原帖
CPP
#include<stdio.h>
#include<cstring>
#include<limits.h>
#include<algorithm>
#define MAXN 110
using namespace std;

int n,temp1,temp2;
int hei[MAXN];
int a[MAXN],d[MAXN];

inline bool select(int key){
    temp1=0;
    int cnt=1;
    for(int O=1;O<key;O++)
    {
        if(hei[O]<hei[key])
        a[cnt++]=hei[O];
    }
    temp1=cnt-1;
    return (cnt!=1);
}

inline bool transf(int key){
    temp2=0;
    int cnt=1;
    for(int I=key+1;I<=n;I++)
    {
        if(hei[I]<hei[key])
        a[cnt++]=-hei[I];
    }
    temp2=cnt-1;
    return (cnt!=1);
}

inline void clad(){
    memset(a,0,sizeof(a));
    memset(d,0,sizeof(d));
}

inline int LIS(int n){
    d[1]=a[1];
    int len=1;
    for(int i=2;i<=n;i++)
    {
        if (a[i]>d[len])d[++len]=a[i]; 
        else
        {
            int j=upper_bound
			(d+1,d+len+1,a[i])-d;
            d[j]=a[i]; 
        }
    }
    return len;
}

inline void TEST(int i,int x){
	printf("test: %d,LIS=%d\n",i,x);
	system("pause");
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d",&hei[i]);

    int minn=INT_MAX;
    for(int i=2;i<n;i++)
    {
        clad();
        if(!select(i))continue;
        int len1=LIS(temp1);
        clad();
        if(!transf(i))continue;
        int len2=LIS(temp2);        
        //TEST(i,len1);
        //TEST(i,len2);
        int ans=n-len1-len2-1;
        if(ans<minn)minn=ans;
    }

    printf("%d",minn);
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...