求助,为什么代码会超时啊,有什么好的优化方法吗

P1320 压缩技术(续集版)

2091088157xd @ 2022-02-13 20:57:56

这是我写的代码,结果都正确,但是都超时了,有什么好办法优化吗


#include<stdio.h>
int a[10000] = { 0 }, b[10000] = { 0 };
int main ()
{
    char x='0',X = '0';
    int k = 0, n, i, j = 1, z = 1, mark, sum = 0;
    for (; 1;)//无限循环,后面有停止条件
    {
        scanf("%c", &x);
        if (x != '\n')
        {   sum++;//sum统计输入的数字字符数
            x == X ? mark = 0 : mark = 1;
            X = x;
            //int(x - '0') == X ? mark = 0 : mark = 1;//如果发生了变化,则开关就会打开,对应的计数数组就会移动至下一位
            //X = int(x - '0');//把字符转化为数字
            if (X=='1')//开始判断数字,并分配
            {
                a[j]++;
                if (mark==1)//如果开关打开,则对另一个数组进行移位到下一个空间
                {
                    z++;
                }
            }
            else 
            {
                b[z]++;
                if (mark==1)//如果开关打开,则对另一个数组进行移位到下一个空间
                {
                    j++;
                }
            }
        } else 
        {
            if (k==0)//通过第一次出现回车来判断n的值,并进行单次记录
            {
                k = sum;
            }
            if (sum == k * k)//for循环的判断语句,当sum达到n的二次方时停止
            {
                break;
            }
        }
    }
    printf("%d ",k);//输出n
    for (i = 1; i < j + z; i++)
    {
        if (i % 2 != 0)
        {
            printf("%d ", b[(i + 1) / 2]);//输出0的个数,因为0的个数一定排在i的奇数位,故用除二的方法来得出b得的数组位数
        }
        else
        {
            printf("%d ", a[i/2]);
        }
    }
    return 0;
}

by 2091088157xd @ 2022-02-13 21:11:37

我自己又改了一下


#include<stdio.h>
int a[10000] = { 0 };
int main ()
{
    char x='0',X = '0';
    int k = 0, n, i, j = 1, mark, sum = 0;
    for (; 1;)//无限循环,后面有停止条件
    {
        scanf("%c", &x);
        if (x != '\n')
        {
            sum++;//sum统计输入的数字字符数
            x == X ? mark = 0 : mark = 1;
            X = x;
            //int(x - '0') == X ? mark = 0 : mark = 1;//如果发生了变化,则开关就会打开,对应的计数数组就会移动至下一位
            //X = int(x - '0');//把字符转化为数字
            if (mark == 1)//如果开关打开,则对另一个数组进行移位到下一个空间
            {
                j++;

            }   
            a[j]++;
        }
        else
        {
            if (k==0)//通过第一次出现回车来判断n的值,并进行单次记录
            {
                k = sum;
            }
            if (sum == k * k)//for循环的判断语句,当sum达到n的二次方时停止
            {
                break;
            }
        }
    }
    printf("%d ",k);//输出n
    for (i = 1; i <= j ; i++)
    {
            printf("%d ", a[i]);
    }
    return 0;
}

by AAATM @ 2022-03-22 19:42:36

试试先把所有字符串加在一起


|