求助一道题目
  • 板块灌水区
  • 楼主__Octhyccc__
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/9/22 22:56
  • 上次更新2023/11/2 18:39:45
查看原帖
求助一道题目
995753
__Octhyccc__楼主2023/9/22 22:56

给一个长为 nn 的序列 aa ,请问要在这个序列中删除长度为多少的前缀,才能使这个序列是一个完美序列。

完美序列的定义:完美序列的定义为:假定有一个序列 bb,你可以每次从序列的首项或末项取出一个数字放在序列 cc 的末尾。假如存在一种方案使得 cc 为不降序列,那么 bb 就是完美序列。

第一行一个整数 n$$(n\le2000),表示序列 aa 的长度。

第二行 nn 个数,a1,a2,a3,......,ana_1,a_2,a_3,......,a_n,对于序列 aa 中的每一个元素,都有 0≤ai≤1060\le a_i\le 10^6

求把序列 aa 变成一个完美序列最少需要删除长度为多少的前缀。

错误原因:

老师给我的递归代码来了一组 hack:

7
4 3 3 8 4 5 2

正确的输出:4

我的:

4
5
6
7

所以球球 DLDL 们告诉我错在哪里了,好吗?

代码:

#include<bits/stdc++.h>
using namespace std;
int read() {
    register int x = 0,f = 1;register char ch;
    ch = getchar();
    while(ch > '9' || ch < '0'){if(ch == '-') f = -f;ch = getchar();}
    while(ch <= '9' && ch >= '0'){x = x * 10 + ch - 48;ch = getchar();}
    return x * f;
}
int a[2000],n,m=0;
void search(int x,int y,int z){// x 和 y 表示搜索的范围,z 表示元素必须大于等于 z,w 表示现存的元素数。 
	if(x>=y){
		if(a[x]>=z){
			printf("%d\n",m);
			return;
		}
		else{
			++m;search(m,n-1,0);
		}
	}
	if(a[x]<z && a[y]<z){
		++m;search(m,n-1,0);
	}
	else if(a[x]<z)search(x,y-1,a[y]);
	else if(a[y]<z)search(x+1,y,a[x]);
	else{
		if(a[x]>=a[y])search(x,y-1,a[y]);
		else search(x+1,y,a[x]);
	}
}
int main(){
	#ifdef ONLINE_JUDGE
	freopen("perfect.in","r",stdin);
	freopen("perfect.out","w",stdout);
	#endif
	t=read();n=read();
	for(int i=0;i<n;i++){
		a[i]=read();
	}
	search(0,n-1,0);
	return 0;
}

2023/9/22 22:56
加载中...