题意就是将给的数列,数字大的尽量在前(最大的要在最前,应该是没有专门设置不是最大数字在最前的样例的,不然太恶心了),但是这个数和其之后的数要一起走,并且相对位置不变
思路在写的时候一起写了(其实是自己被自己绕晕了,不得不写qaq)
#include <bits/stdc++.h> using namespace std; int main() { int t,n; cin>>t; while(t--) { cin>>n; int a[100005],b[100005],c[100005],d[100005]; for(int i=1;i<=n;i++) { cin>>a[i];//原数组 c[a[i]]=i;//元素位置 b[i]=a[i];//复制原数组 d[a[i]]=1;//元素存在判定 } sort(a+1,a+1+n);//加个1好处理位置,不然的情况我已经经历过了 int p=n; for(int i=n;i>=1;i--) { if(d[a[i]])// 判断是否被输出,直到找到未被输出的最大数 { int q = c[a[i]];//最大数字的位置 for(int k=q;k<=p;k++) { cout<<b[k]<<" ";//找到最大数位置后从原数组输出其之后的所有数 d[b[k]]=0;//更换输出后该数的标记 } p=q-1;//回到最大数之前开始遍历 } } cout<<endl; } return 0; }