c语言归并排序相关的问题

img

img

关于c语言的贪心算法,这里我没有采用结构体,想用归并排序来排序(因为冒泡会超时),不知道哪里出了问题,自认为归并排序也许是出问题了,我试了很多例子也都是对的,但是交上去只对了一半用例,错误的原因是WA

#include 
long long n;
long long x;
long long y;
long long i,j;
long long a=0;
long long qian=0;
int jiafenx[200010],jianfenx[200010];
int jiafeny[200010],jianfeny[200010];
int jianfenx2[200010],jianfeny2[200010];
int jiafengeshu=0,jianfengeshu=0;
int jiafeny2[200010];


void merge_sort_recursive(int arr[], int reg[], int start, int end) {
    if (start >= end)
        return;
    int len = end - start, mid = (len >> 1) + start;
    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;
    merge_sort_recursive(arr, reg, start1, end1);
    merge_sort_recursive(arr, reg, start2, end2);
    int k = start;
    while (start1 <= end1 && start2 <= end2){
        // reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
        if(arr[start1]>arr[start2]){
            reg[k]=arr[start2];
            jiafeny2[k]=jiafeny[start2];
            k++;
            start2++;
        }
        else{
            reg[k]=arr[start1];
            jiafeny2[k]=jiafeny[start1];
            k++;
            start1++;
        }
    }
    while (start1 <= end1){
        reg[k] = arr[start1];
        jiafeny2[k]=jiafeny[start1];
        k++;
        start1++;
    }
    while (start2 <= end2){
        reg[k] = arr[start2];
        jiafeny2[k]=jiafeny[start2];
        k++;
        start2++;
    } 
    for (k = start; k <= end; k++){
        arr[k] = reg[k];
        jiafeny[k]=jiafeny2[k];
    }  
}
void merge_sort(int arr[], const int len) {
    int reg[len];
    merge_sort_recursive(arr, reg, 0, len - 1);
}


void merge_sort2_recursive(int arr[], int reg[], int start, int end) {
    if (start >= end)
        return;
    int len = end - start, mid = (len >> 1) + start;
    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;
    merge_sort2_recursive(arr, reg, start1, end1);
    merge_sort2_recursive(arr, reg, start2, end2);
    int k = start;
    while (start1 <= end1 && start2 <= end2){
        // reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
        if(arr[start1]>arr[start2]){
            jianfenx2[k]=jianfenx[start1];
            jianfeny2[k]=jianfeny[start1];
            k++;
            start1++;
        }
        else{
            jianfenx2[k]=jianfenx[start2];
            jianfeny2[k]=jianfeny[start2];
            k++;
            start2++;
        }
    }
    while (start1 <= end1){
        jianfenx2[k]=jianfenx[start1];
        jianfeny2[k]=jianfeny[start1];
        k++;
        start1++;
    }
    while (start2 <= end2){
        jianfenx2[k]=jianfenx[start2];
        jianfeny2[k]=jianfeny[start2];
        k++;
        start2++;
    } 
    for (k = start; k <= end; k++){
        jianfenx[k]=jianfenx2[k];
        jianfeny[k]=jianfeny2[k];
    }  
}
void merge_sort2(int arr[], const int len){
    int reg[len];
    merge_sort2_recursive(arr, reg, 0, len - 1);
}


int main(){
    scanf("%lld",&n); 
    i=0,j=0;
    while(i+j();
        scanf("%lld",&x);
        getchar();
        scanf("%lld",&y);
        if(y<=0){
            jianfenx[i]=x;
            jianfeny[i]=y;
            jianfengeshu++;
            i++;
        }
        else{
            jiafenx[j]=x;
            jiafeny[j]=y;
            jiafengeshu++;
            j++;
        }        
    }
    //先打jiafen的龙 从x最小打到最大
    merge_sort(jiafenx,jiafengeshu);
    for(i=0;iif(a>=jiafenx[i]){
            a=a+jiafeny[i];
        }
        else{
            qian=qian+jiafenx[i]-a;
            a=jiafenx[i]+jiafeny[i];
        }
    }
    //再打jianfen的龙 从打完的a最大打到最小
    int chazhi[200010];
    for(i=0;i[i]=jianfenx[i]+jianfeny[i];
    }
    merge_sort2(chazhi,jianfengeshu); 
    for(i=0;iif(a>=jianfenx[i]){
            a=a+jianfeny[i];
        }
        else{
            qian=qian+jianfenx[i]-a;
            a=jianfenx[i]+jianfeny[i];
        }
    }
    printf("%lld\n",qian);
    return 0;
}

归并排序都是有三个参数的,你这个有点问题
可以试试换成快速排序

#include <stdio.h>
long long n;
long long x;
long long y;
long long i,j;
long long a=0;
long long qian=0;
int jiafenx[200010],jianfenx[200010];
int jiafeny[200010],jianfeny[200010];
int jianfenx2[200010],jianfeny2[200010];
int jiafengeshu=0,jianfengeshu=0;
int jiafeny2[200010];
 
void QuickSort1(int t[],int Begin,int End)
{
    if(Begin>=End) return;
    int Left=Begin,Right=End;
    int tem=t[Begin];
    while(Begin<End)
    {
        while(Begin<End&&t[End]>=tem)
        {
            End--;
        }
        t[Begin]=t[End];
        while(Begin<End&&t[Begin]<=tem)
        {
            Begin++;
        }
        t[End]=t[Begin];
    }
    t[Begin]=tem;
    QuickSort1(t,Left,Begin-1);
    QuickSort1(t,Begin+1,Right);
}
void QuickSort2(int t[],int Begin,int End)
{
    if(Begin>=End) return;
    int Left=Begin,Right=End;
    int tem=t[Begin];
    while(Begin<End)
    {
        while(Begin<End&&t[End]<=tem)
        {
            End--;
        }
        t[Begin]=t[End];
        while(Begin<End&&t[Begin]>=tem)
        {
            Begin++;
        }
        t[End]=t[Begin];
    }
    t[Begin]=tem;
    QuickSort2(t,Left,Begin-1);
    QuickSort2(t,Begin+1,Right);
}
int main(){
    scanf("%lld",&n); 
    i=0,j=0;
    while(i+j<n){
        getchar();
        scanf("%lld",&x);
        getchar();
        scanf("%lld",&y);
        if(y<=0){
            jianfenx[i]=x;
            jianfeny[i]=y;
            jianfengeshu++;
            i++;
        }
        else{
            jiafenx[j]=x;
            jiafeny[j]=y;
            jiafengeshu++;
            j++;
        }        
    }
    //先打jiafen的龙 从x最小打到最大
    QuickSort1(jiafenx,0,jiafengeshu-1);
    for(i=0;i<jiafengeshu;i++){
        if(a>=jiafenx[i]){
            a=a+jiafeny[i];
        }
        else{
            qian=qian+jiafenx[i]-a;
            a=jiafenx[i]+jiafeny[i];
        }
    }
    //再打jianfen的龙 从打完的a最大打到最小
    int chazhi[200010];
    for(i=0;i<jianfengeshu;i++){
        chazhi[i]=jianfenx[i]+jianfeny[i];
    }
    QuickSort2(chazhi,0,jianfengeshu-1); 
    for(i=0;i<jianfengeshu;i++){
        if(a>=jianfenx[i]){
            a=a+jianfeny[i];
        }
        else{
            qian=qian+jianfenx[i]-a;
            a=jianfenx[i]+jianfeny[i];
        }
    }
    printf("%lld\n",qian);
    return 0;
}