文章

14

粉丝

0

获赞

137

访问

4.1k

头像
能否排序 题解:自己编译器运行结果没问题 为什么就是wrong answer
P1741 湖南大学机试题
发布于2025年3月18日 11:05
阅读数 225

#include <stdio.h>
typedef struct Num{
    int data;
    int flag;
}Num;

//排序
void B_Sort(Num nums[],int n){
        int i,j,index;
        Num temp;
        for(i=0;i<n-1;i++){
            index = 1;
            for(j=0;j<n-1-i;j++){
                if((nums[j].flag!=nums[j+1].flag) && (nums[j].data>nums[j+1].data)){
                    temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
     &...

登录查看完整内容


登录后发布评论

1 条评论
快乐小土狗
2025年3月18日 17:23

根据题目要求,我们需要判断是否可以通过交换属性不同的元素使得数组有序。关键在于以下两个条件:

如果所有元素的属性相同:此时无法进行任何交换,因此数组必须已经是升序的才能输出"Yes"。

存在两种不同的属性:无论原数组如何,都可以通过交换将数组排序,因此直接输出"Yes"。

原代码使用冒泡排序并检查排序后的数组是否有序,这在时间复杂度(O(n²))和逻辑上存在问题。正确的做法是直接根据上述两个条件进行判断,无需实际排序。
 

#include <stdio.h>
#include <stdbool.h>

// 检查数组是否有序
bool isSorted(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        if (arr[i] < arr[i - 1]) {
            return false;
        }
    }
    return true;
}

// 检查属性是否全为0或全为1
bool allSame(int flags[], int n) {
    int first = flags[0];
    for (int i = 1; i < n; i++) {
        if (flags[i] != first) {
            return false;
        }
    }
    return true;
}

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        int n;
        scanf("%d", &n);
        int data[n], flags[n];
        for (int i = 0; i < n; i++) {
            scanf("%d", &data[i]);
        }
        for (int i = 0; i < n; i++) {
            scanf("%d", &flags[i]);
        }
        
        // 如果原数组已经有序
        if (isSorted(data, n)) {
            printf("Yes\n");
            continue;
        }
        
        // 如果属性全为0或全为1
        if (allSame(flags, n)) {
            printf("No\n");
        } else {
            printf("Yes\n");
        }
    }
    return 0;
}

代码解释
isSorted函数:检查数组是否已经是升序排列。

allSame函数:检查所有元素的属性是否全为0或全为1。

主逻辑:

首先检查原数组是否已经有序,若是则直接输出"Yes"。

若数组无序,检查属性是否全相同。若全相同则输出"No",否则输出"Yes"(因为存在两种属性,可通过交换排序)。

该方法时间复杂度为O(n),能够高效处理题目中的最大数据规模。

赞(0)