当前位置: 代码迷 >> 综合 >> (复习次数:1)D - Permutation Transformation——Codeforces Round #702 (Div. 3)
  详细解决方案

(复习次数:1)D - Permutation Transformation——Codeforces Round #702 (Div. 3)

热度:87   发布时间:2023-11-21 17:24:59.0

https://codeforces.com/contest/1490/problem/D
一手递归
终结:没有子树
继续:把最大的找到,为记录,为界,加层数,左范围,右范围

#include<stdio.h>
#include<string.h>
#include<queue>
#define ll long long 
#define inf 0x3f3f3f3f
using namespace std;
int a[105];
int b[105];
int n;
void build(int num,int l,int r){
    if(l>r)return;int i;int max1=l;for(i=l+1;i<=r;i++){
    if(a[i]>a[max1]){
    max1=i;}}b[max1]=num;build(num+1,l,max1-1);build(num+1,max1+1,r);
}
int main()
{
     int t;scanf("%d",&t);while(t--){
    scanf("%d",&n);for(int i=1;i<=n;i++){
    scanf("%d",&a[i]);}memset(b,0,sizeof(b));build(0,0,n);for(int i=1;i<=n;i++){
    printf("%d ",b[i]);}printf("\n");}return 0;
}

复习代码:
5/18
语法发现:
1.//<bits\stdc++.h>其实是一样的也可以!!
2. //max_element(p,p+n):和sort一样包左不包右;
//注意给的是元素指针,化为整数可以1.*——值2.max_element()-a——序号。注意区分
参考:C++寻找数组最大值和最小值

#include<bits/stdc++.h>//<bits\stdc++.h>其实是一样的也可以!! 
#ifdef LOCAL
FILE*FP=freopen("text.in","r",stdin);
#endif
using namespace std;
int a[102],d[102];
void build(int l,int r,int dep){
    if(l>r)return;int m=max_element(&a[l],&a[r+1])-a;//max_element(p,p+n):和sort一样包左不包右;//注意给的是元素指针,化为整数可以1.*——值2.max_element()-a——序号。注意区分 d[m]=dep;build(l,m-1,dep+1);build(m+1,r,dep+1);
}
signed main(){
    int t;scanf("%d",&t);while(t--){
    int n;scanf("%d",&n);for(int i=1;i<=n;i++){
    scanf("%d",&a[i]);}build(1,n,0);for(int i=1;i<=n;i++){
    printf("%d",d[i]);putchar((i==n?'\n':' '));}}return 0;
}
  相关解决方案