40分!求大佬帮帮看看错在哪了!谢谢!

P1319 压缩技术

zst0915 @ 2024-03-06 22:35:53

#include<bits/stdc++.h>
using namespace std;

int main ()
{
    int n,m=0,o=0,p=0;scanf("%d",&n);int arr[n];

    for (int i=1;o<n*n;i++)
    {
        cin>>arr[i];
        o+=arr[i];
        p++;
    }

    for (int i=1;i<=p;i++)
    {
        for(int j=1;j<=arr[i];j++)
        {

         if(i%2==0){printf ("1");}
         else{printf ("0");}
          m++;
         if(m%n==0)
         {printf ("\n");}
        }

    }

    return 0;
}

by Papy @ 2024-03-06 22:57:35

@zst0915

Hi~ 又见面了哈哈哈

看看开的数组,是arr[n], 但是你看看样例就知道大小不一定是n了。假设最坏情况是一个1一个0出现的,那么最多会有n*n个数出现,这样就会内存溢出。

建议至少开nxn+1,因为nxn开的是0到n*n-1的下标。因为你的代码是从1开始存的,有可能存到你nxn也会内存溢出。

我顺便改了一下码风,你看看你喜欢哪种~```cpp

include <iostream>

include <cstdio>

using namespace std; int main(){ int n, m=0, o=0, p=0; scanf("%d", &n); int arr[n*n+1];

for (int i = 1; o < n*n; i++){
    cin>>arr[i];
    o += arr[i];
    p++;
}

for (int i = 1; i <= p; i++){
    for(int j = 1; j <= arr[i]; j++){
        if (i % 2 == 0)
            printf("1");
        else
            printf("0");

        m++;
        if (m % n == 0)
            printf("\n");
    }
}

return 0;

}



这样*应该*就可以了吧qwq

by Papy @ 2024-03-06 22:58:19

@zst0915 发现一不小心格式弄错了qwq

#include <iostream>
#include <cstdio>
using namespace std;
int main(){
    int n, m=0, o=0, p=0;
    scanf("%d", &n);
    int arr[n*n+1];

    for (int i = 1; o < n*n; i++){
        cin>>arr[i];
        o += arr[i];
        p++;
    }

    for (int i = 1; i <= p; i++){
        for(int j = 1; j <= arr[i]; j++){
            if (i % 2 == 0)
                printf("1");
            else
                printf("0");

            m++;
            if (m % n == 0)
                printf("\n");
        }
    }

    return 0;
}

by Papy @ 2024-03-06 23:12:46

这是我刚写的代码 你可以看看我的思路:

注释版:

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 2e2+5;
int n, a[maxn*maxn];
int main(){
    scanf("%d", &n);
    int len = 0;
    //输入直到为0为止
    while (cin>>a[++len])
        continue;
    //因为最后一位为0,所以len要-1
    len--;

    //now为当前算到压缩码的第now位
    int now = 1;
    for (int i = 1; i <= n*n; i++){
        //如果a[now]为0, now++, 开始解压下一位压缩码
        if (a[now] == 0)
            now++;
        a[now]--;

        // &1效果与%2相等,可以了解一下位运算
        if (now & 1)
            printf("0");
        else
            printf("1");

        //换行判断
        if (i % n == 0)
            printf("\n");
    }

    return 0;
}

无注释版:

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 2e2+5;
int n, a[maxn*maxn];
int main(){
    scanf("%d", &n);
    int len = 0;
    //输入直到为0为止
    while (cin>>a[++len])
        continue;
    //因为最后一位为0,所以len要-1
    len--;

    //now为当前算到压缩码的第now位
    int now = 1;
    for (int i = 1; i <= n*n; i++){
        //如果a[now]为0, now++, 开始解压下一位压缩码
        if (a[now] == 0)
            now++;
        a[now]--;

        // &1效果与%2相等,可以了解一下位运算
        if (now & 1)
            printf("0");
        else
            printf("1");

        //换行判断
        if (i % n == 0)
            printf("\n");
    }

    return 0;
}

几年前我写的版本(我已经看不懂了,但它AC了我也说不了什么qwq):

#include <iostream>
using namespace std;
int n,cnt,timer = 0,flag = 0;
int main(){
    cin>>n>>cnt;
    while(cnt+1){
        if (cnt > 0){
            timer++;
            cnt--;
            cout<<flag;
            if (timer % n == 0) cout<<endl;
            if (timer >= n * n) cnt--;
        }else flag = !flag, cin>>cnt;
    }
    return 0;
} 

几年前我的码风还是很诡异的,没必要看懂qwq

希望能够帮到你~ -v-


by Papy @ 2024-03-06 23:14:01

@zst0915 无注释版复制错了呜呜呜又得发一个贴qwq

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 2e2+5;
int n, a[maxn*maxn];
int main(){
    scanf("%d", &n);
    int len = 0;
    while (cin>>a[++len])
        continue;
    len--;

    int now = 1;
    for (int i = 1; i <= n*n; i++){
        if (a[now] == 0)
            now++;
        a[now]--;

        if (now & 1)
            printf("0");
        else
            printf("1");

        if (i % n == 0)
            printf("\n");
    }

    return 0;
}

by zst0915 @ 2024-03-07 20:59:46

@Papy 我把数组开大了,ac了谢谢大佬!!!


by Papy @ 2024-03-07 21:21:36

@zst0915 没事没事!加油~ (-v-)=b


by zst0915 @ 2024-03-07 21:22:43

@Papy 都看懂了!谢谢你!!! 几年前写的真简洁!好厉害!


by Papy @ 2024-03-07 21:28:25

@zst0915 没有没有 几年前我真的很菜qwq

你肯定能比我厉害的,加油哦! (^-^)=b


by zst0915 @ 2024-03-08 22:56:40

@Papy 谢谢你的鼓励哈哈,我是个小白,我断断续续才学半年!一起加油!祝你也能ac更多题,成为更厉害的人!


by Papy @ 2024-03-08 23:03:44

@zst0915 谢谢!以后有问题可以随时私信我哦-


|