思路:
首先贪心肯定是不择手段的把大的数放在最前面,这种平方级运算大数必须靠前,不然低平方的常数再大也不肯能弥补高平方,所以这题就变成了找最大值了,预处理出来整个区间的前缀最值就行了,但遍历得倒着遍历,因为预处理的是前缀最值,倒序遍历到的前缀最值必然是当前前缀最大的,正序遍历则不能保证,因为后面可能还有更大的,然后遍历到了就输出当前片段即可
Code:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
int a[N],Smax[N];
void solve()
{
memset(Smax,0,sizeof Smax);
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],Smax[i]=max(Smax[i-1],a[i]);
int r=n;
for(int i=n;i>=1;i--)
{
if(a[i]==Smax[i])
{
for(int j=i;j<=r;j++) cout<<a[j]<<" ";
r=i-1;
}
}
cout<<endl;
}
int main()
{
int _;
cin>>_;
while(_--) solve();
return 0;
}
文章评论