求助大佬!#8、#9、#10error
查看原帖
求助大佬!#8、#9、#10error
925465
ForSunlight楼主2023/8/30 21:18
#include <stdio.h>
int n;
int Round;
int q;
struct E{
    int score;
    int strange;
    int name;
} member1[2000005];
struct E Winner[2000005];
struct E Loser[2000005];
struct E member2[2000005];
int Sort(void);
void PK(int classes);
void Merge(struct E member1[], struct E member2[], int l, int mid, int r);
int main()
{
    scanf("%d %d %d", &n, &Round, &q);
    for (int i = 1; i <= 2 * n; i++){
        scanf("%d", &member1[i].score);
        member1[i].name = i;
    }
    for (int i = 1; i <= 2 * n; i++){
        scanf("%d", &member1[i].strange);
    }
    if(Sort() == 1){    //若返回值为1,则最终排序结果保存在member1中,否则在member2中
        for (int i = 1; i <= Round; i++){
            PK(1);
        }
        printf("%d", member1[q].name);
    }else{
        for (int i = 1; i <= Round; i++){
            PK(2);
        }
        printf("%d", member2[q].name);
    }
}

int Sort(void)
{
    int length = 1;
    int temp = 1;
    while(length < n * 2){
        for (int i = 1; i + length - 1 <= n * 2; i += (length * 2)){
            if(temp % 2){   //将member1归并到member2
                Merge(member1, member2, i, i + length - 1, i + 2 * length - 1);
            }else{  //将member2归并到member1
                Merge(member2, member1, i, i + length - 1, i + 2 * length - 1);
            }
        }
        temp++;
        length *= 2;
    }
    if(temp % 2){
        return 1;
    }
    return 2;
}

void Merge(struct E member1[], struct E member2[], int l, int mid, int r)
{
    int i = l;
    int j = mid + 1;
    int k = l;
    while(i <= mid && j <= r && j <= n * 2){
        if(member1[i].score >= member1[j].score){
            member2[k++] = member1[i];
            i++;
        }else{
            member2[k++] = member1[j];
            j++;
        }
    }
    while(i <= mid){
        member2[k++] = member1[i++];
    }
    while(j <= r && j <= n * 2){
        member2[k++] = member1[j++];
    }
}

void PK(int classes)
{
    int cnt = 1;
    if(classes == 1){
        for (int i = 1; i <= n * 2 - 1; i += 2){
            if(member1[i].strange > member1[i + 1].strange){
                member1[i].score++;
                Winner[cnt] = member1[i];
                Loser[cnt] = member1[i + 1];
                cnt++;
            }else{
                member1[i + 1].score++;
                Winner[cnt] = member1[i + 1];
                Loser[cnt] = member1[i];
                cnt++;
            }
        }
        int i = 1;
        int j = 1;
        cnt = 1;
        while (i <= n && j <= n){
            if(Winner[i].score > Loser[j].score){
                member1[cnt++] = Winner[i++];
            }
            if(Winner[i].score < Loser[j].score){
                member1[cnt++] = Loser[j++];
            }
            if(Winner[i].score == Loser[j].score){
                if(Winner[i].name < Loser[j].name){
                    member1[cnt++] = Winner[i++];
                }else{
                    member1[cnt++] = Loser[j++];
                }
            }
        }
        while(i <= n){
            member1[cnt++] = Winner[i++];
        }
        while(j <= n){
            member1[cnt++] = Loser[j++];
        }
    }else{
        for (int i = 1; i <= n * 2 - 1; i += 2){
            if(member2[i].strange > member2[i + 1].strange){
                member2[i].score++;
                Winner[cnt] = member2[i];
                Loser[cnt] = member2[i + 1];
                cnt++;
            }else{
                member2[i + 1].score++;
                Winner[cnt] = member2[i + 1];
                Loser[cnt] = member2[i];
                cnt++;
            }
        }
        int i = 1;
        int j = 1;
        cnt = 1;
        while (i <= n && j <= n){
            if(Winner[i].score > Loser[j].score){
                member2[cnt++] = Winner[i++];
            }
            if(Winner[i].score < Loser[j].score){
                member2[cnt++] = Loser[j++];
            }
            if(Winner[i].score == Loser[j].score){
                if(Winner[i].name < Loser[j].name){
                    member2[cnt++] = Winner[i++];
                }else{
                    member2[cnt++] = Loser[j++];
                }
            }
        }
        while(i <= n){
            member2[cnt++] = Winner[i++];
        }
        while(j <= n){
            member2[cnt++] = Loser[j++];
        }
    }
}

调了好久,感觉思路也正确,不知道错在哪里了。

2023/8/30 21:18
加载中...