題目分析
Input:
第一行:一個正整數N(N<=100000)
第二行:N個互不相同的正整數,用空格分隔
Output:
第一行:符合條件的數的個數
第二行:按照升序輸出
求解思路
- int類型的數組arr[N]:存放了原始數據
- maxBefore:當前左側最大值(初始化為-1)
- minBehind:當前右側最小值(初始化為1000000005)
- int類型的數組res[N]:存放結果
- bool類型的數組flag[N]:flag[i]指示arr[i]是否為我們要找的元素,若是,flag[i]=true;否則flag[i]=false。
- 在輸入的時候,假設當前輸入為arr[i],判斷arr[i]是否大于maxBefore,同時更新maxBefore和flag[i]的值。
- 逆序遍歷數組,判斷arr[i]是否小于minBehind,若不是,將flag[i]的值更新為false。若此時flag[i]為true,則arr[i]為我們要找的元素,存入res數組中。
- 輸出時,若sum為0,則輸出空的一行(必須輸出空的一行,否則有的樣例不能通過);若sum不為0,調用sort()函數,將res數組升序排列后輸出。
C++源碼
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int N;
int sum = 0;
cin>>N;
bool *flag = new bool[N];
int *arr = new int[N];
int *res = new int[N];
int maxBefore = -1;
int minBehind = 1000000005;
for(int i = 0; i < N; i++)
{
flag[i] = true;
}
for(int i = 0; i < N; i++)
{
cin>>arr[i];
if(arr[i] > maxBefore)
{
maxBefore = arr[i];
}
else
{
flag[i] = false;
}
}
for(int i = N - 1; i >= 0; i--)
{
if(arr[i] < minBehind)
{
minBehind = arr[i];
}
else
{
flag[i] = false;
}
if(flag[i])
{
sum = sum + 1;
res[sum - 1] = arr[i];
}
}
cout<<sum<<endl;
if(sum == 0)
{
cout<<endl;
}
else
{
//res[0..sum-1]
sort(res, res + sum);
for(int i = 0; i < sum; i++)
{
cout<<res[i];
if(i != sum - 1)
{
cout<<" ";
}
}
}
return 0;
}