判断是否为美丽数组c++思路和实现
这段代码的功能是对于给定的多个序列,判断每个序列是否是一个 beautiful 序列。没次读取当前的序列判断之后再加入下一个数字进序列。
首先,输入一个整数 t,表示测试数据组数。
对于每组测试数据,从输入中读入一个整数 q,表示序列的长度。
然后,循环读入 q 个整数,并对每个整数进行处理:
a. 如果是前两个数,直接将其设为 beautiful。之后记录下最小值 minVal,如果出现后面的数小于等于 minVal,则说明出现了递减数,将其标记为
1,并且记录下当前数为 nextVal,以便后面比较使用。
b. 如果不是前两个数,根据前面的情况,判断当前数是否是 beautiful。如果前面没有出现递减数,只需要判断当前数是否大于等于 vector 中的最后一个数,如果是,说明当前数是 beautiful,将其标记为 1。如果当前数小于 vector 中的最后一个数,说明出现了递减数,将其标记为 1,并且记录下 nextVal。如果前面已经出现了递减数,只需要判断当前数是否在
[minVal,nextVal] 区间内,如果是,说明当前数是 beautiful,将其标记为
1。否则,将其标记为 0。
输出处理后的序列,输出完毕后,返回到第 2 步,继续处理下一组测试数据。
#include <iostream>
using namespace std;
char str[200005]={0};
int arr[200005];
int main()
{
int t,q,i=0,j=0;
int val;
int k=0;
scanf("%d",&t);
while(i<t)
{
cin >> q;
int flag = 0; //标记是否出现递减数
k = 0;
for(j=0;j<q;j++) //读入q个数
{
scanf("%d",&val);
if(k== 0 ) //是beatiful
{
str[j]='1';
arr[k++]=val;
}else if(k == 1) //是beatiful
{
str[j]='1';
arr[k++]=val;
if(val < arr[0])//判断是否出现递减的情况
flag = 1;
}else
{
if(flag == 0) //没有出现递减数,只需要判断当前数与vector中的最后一个数的大小
{
if(val >= arr[k-1]) //保持非递减
{
str[j]='1';
arr[k++]=val; //是
}else //出现递减数
{
if(val <= arr[0])
{
str[j]='1';
arr[k++]=val;
flag = 1;
}else
str[j]='0';
}
}else
{
if(val >= arr[k-1] && val <= arr[0] )
{
str[j]='1';
arr[k++]=val;
}else{
str[j]='0';
}
}
}
}
str[q] = 0;
//输出
cout << str<<endl;
i++;
}
return 0;
}