大佬们看看有什么不一样吗,solve部分
查看原帖
大佬们看看有什么不一样吗,solve部分
1106289
KomorKomor楼主2024/3/20 19:57
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int a[262146],a1[262146],a2[262146];
int read()//快读
{
    int x=0,f=1;
    char ch=getchar();
    while(ch>'9'||ch<'0')   {if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-48,ch=getchar();}
    return x*f;
}
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])//合法
    {
        int m=solve(l,mid),n=solve(mid+1,r);
        if(m==-1||n==-1)    return -1;
           return m+n;
    }
    if(a2[k-1]<a1[1])//合法
    {
        int m=solve(l,mid),n=solve(mid+1,r);
        if(m==-1||n==-1)    return -1;
           return m+n+1;//多进行一次交换
    }
    return -1;//如果不合法

}
int main()
{
    int x;
    x=read();
    while(x--)
    {
        int n=read();
        int sum=0;//每次重置结果
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)   a[i]=read();
        cout<<solve(1,n)<<endl;
    }
    return 0;
}

——————分割线——————————————

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int a[262146],a1[262146],a2[262146];
int read()//快读
{
    int x=0,f=1;
    char ch=getchar();
    while(ch>'9'||ch<'0')   {if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-48,ch=getchar();}
    return x*f;
}
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 main()
{
    int x;
    x=read();
    while(x--)
    {
        int n=read();
        int sum=0;//每次重置结果
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)   a[i]=read();
        cout<<solve(1,n)<<endl;
    }
    return 0;

  大佬们求救啊,我脑袋要想爆了都不明白为什么不一样,第一段代码是对的
2024/3/20 19:57
加载中...