大佬们帮帮我
  • 板块题目总版
  • 楼主KomorKomor
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/2/22 22:07
  • 上次更新2024/2/23 09:46:04
查看原帖
大佬们帮帮我
1106289
KomorKomor楼主2024/2/22 22:07
int solve(int l,int r)
{
    if(l==r)    return 0;
    int mid=(l+r)/2;
    int k=1,j=1;
    //分别复制左半边数组和右半边数组
    for(int i=l;i<=mid;i++) a1[j++]=a[i];
    for(int i=mid+1;i<=r;i++)   a2[k++]=a[i];
    //分别对两边排序,看看有没有解
    sort(a1+1,a1+k);sort(a2+1,a2+k);
    //如果一部分的最大值小于另外一个部分的最小值
    if(a1[j-1]<a2[1]||a2[k-1]<a1[1])//合法
    {
        int m=solve(l,mid),n=solve(mid+1,r);
        if(m==-1||n==-1)    return -1;
        if(a1[j-1]<a2[1])//如果左边的最大值小于右边的最小值
           return m+n;
        if(a2[k-1]<a1[1])//如果右边的最大值小于左边的最大值
           return m+n+1;//多进行一次交换
    }
    return -1;//如果不合法

}
------------------分割线----------------------
int solve(int l,int r)
{
    if(l==r)    return 0;
    int mid=(l+r)/2;
    int k=1,j=1;
    //分别复制左半边数组和右半边数组
    for(int i=l;i<=mid;i++) a1[j++]=a[i];
    for(int i=mid+1;i<=r;i++)   a2[k++]=a[i];
    //分别对两边排序,看看有没有解
    sort(a1+1,a1+k);sort(a2+1,a2+k);
    //如果一部分的最大值小于另外一个部分的最小值
    if(a1[j-1]<a2[1]||a2[k-1]<a1[1])//合法
    {
        int m=solve(l,mid),n=solve(mid+1,r);
        if(m==-1||n==-1)    return -1;
        if(a1[j-1]<a2[1])//如果左边的最大值小于右边的最小值
           return m+n;
        if(a2[k-1]<a1[1])//如果右边的最大值小于左边的最大值
           return m+n+1;//多进行一次交换
    }
    return -1;//如果不合法

}

大佬们帮我看看有啥逻辑区别

2024/2/22 22:07
加载中...