问题:

Select 一个100,这样101,交换102Ai+1

给定一个数组A,确定它是否是伪排序的.

输入格式

输出格式

您可以用大写或小写打印YESNO的每个字符(例如,yesyEsYes将被视为相同).

限制条件:

  • 1.≤ T≤ 1000
  • 2.≤ N≤ 105
  • 1≤Ai≤109
  • 所有测试用例中N的总和不超过2⋅105

示例输入1:

3
5
3 5 7 8 9
4
1 3 2 3
3
3 2 1

示例输出1:

YES
YES
NO

My Solution:

#include <stdio.h>

int main()
{
    int T, N, ara[100000], count, i, j;
    scanf("%d", &T);
    for (i = 0; i < T; i++)
    {
        scanf("%d", &N);
        for (j = 0; j < N; j++)
        {
             scanf("%d", &ara[j]);
        }
        count = 0;
        for (j = 1; j < N; j++)
        {
            if (ara[j] < ara[j - 1])
            {
                count++;
            }
        }
        if (count <= 1)
        {
            printf("YES\n");
        }
        else if (count > 1)
        {
            printf("NO\n");
        }
    }
    return 0;
}

但是,我在一些测试用例中遇到了错误,尽管我的代码在给定的测试用例中运行良好.有人能帮我识别错误吗?

enter image description here

推荐答案

您的测试统计两个相邻数字出现故障的情况数.这还不足以解决这个问题.下面是一个反例:

1
3
3 1 2

3 1 2产生1count,但需要2次互换.

一旦检测到某个元素出现故障,必须测试将其与前一个元素交换是否可以解决问题:

#include <stdio.h>

int main() {
    int T = 0, ara[100000], count, i, j;
    scanf("%d", &T);
    for (i = 0; i < T; i++) {
        int N = 0;
        scanf("%d", &N);
        for (j = 0; j < N; j++) {
            ara[j] = 0;
            scanf("%d", &ara[j]);
        }
        count = 0;
        for (j = 1; j < N && count < 2; j++) {
            if (ara[j] < ara[j - 1]) {
                int temp = ara[j - 1];
                ara[j - 1] = ara[j];
                ara[j] = temp;
                count++;
                if (j > 1) {
                    j -= 2;
                }
            }
        }
        if (count <= 1) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
    return 0;
}

一旦发现故障,您可以删除数组并避免转换剩余的数字:

#include <stdio.h>

int main() {
    int T = 0, i, j;
    scanf("%d", &T);
    for (i = 0; i < T; i++) {
        int N = 0, n1 = 0, n2 = 0, n3, count = 0, c, temp;
        scanf("%d", &N);
        if (N >= 2) {
            scanf("%d%d", &n1, &n2);
            if (n1 > n2) {
                temp = n1;
                n1 = n2;
                n2 = temp;
                count++;
            }
            for (j = 2; j < N; j++) {
                n3 = 0;
                scanf("%d", &n3);
                if (n2 > n3) {
                    count++;
                    if (count > 1)
                        break;
                    if (n1 > n3) {
                        count++;
                        break;
                    }
                    n1 = n3;
                } else {
                    n1 = n2;
                    n2 = n3;
                }
            }
        }
        /* read and discard the rest of the line */
        while ((c = getchar()) != EOF && c != '\n')
            continue;
        if (count <= 1) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }
    return 0;
}

C++相关问答推荐

字符串令牌化xpath表达式

使用NameSurname扫描到两个单独的字符串

为什么GCC可以调用未定义的函数?

当我运行/调试C程序时,Malloc()似乎正在将&q;r\r...&q;赋值给一个指针,我不确定为什么?

GLIBC:如何告诉可执行文件链接到特定版本的GLIBC

当我更改编译优化时,相同的C代码以不同的方式运行

如何在C中使printf不刷新标准输出?

将宏值传递给ARM链接器,该链接器将变量放置在特定位置

为什么memcpy进入缓冲区和指向缓冲区的指针工作相同?

如何在C中使数组变量的值为常量?

从C文件中删除注释

使用Open62541向OPCUA服务器发送读请求时内存泄漏

用于计算位数和的递归C函数

Linux/C:带有子进程的进程在添加waitid后都挂起

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

C Makefile - 如何避免重复提及文件名

C 语言中霍尔分区的快速排序算法

如何修复数组数据与列标题未对齐的问题?

当循环变量在溢出时未定义时,可以进行哪些优化?

如何在C中以0x格式打印十六进制值