鱼C论坛

 找回密码
 立即注册
查看: 2997|回复: 4

关于此题为什么会内存错误?

[复制链接]
发表于 2012-3-18 22:37:29 | 显示全部楼层 |阅读模式
1鱼币
校门外的树
Time Limit:   1000MS      
Memory Limit:   65535KB
Submissions:   1269      
Accepted:   373
Description
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
Input
输入的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。
Output
输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。
Sample Input
500 3150 300100 200470 471

Sample Output
298

#include <stdio.h>
int main()
{
    int tree[10001];
    int L,M,i,j,t;
    int begin,end;

    for(i=1;i<=10001;i++)
        tree[i]=1;                      //先把全部都赋值为1
    scanf("%d %d",&L,&M);

    for(i=1;i <= M;i++)
    {
        scanf("%d %d",&begin,&end);
        if(begin>end)              //容错处理
        {
            t=begin;
            begin=end;
            end=t;
        }
        for(j=begin;j <= end;j++)        //把输入的范围赋值为0
            tree[j]=0;
    }
    int count=0;
    for(i=1;i <= L;i++)
    {
        if(tree[i]==1)             //  统计剩余的范围
            count++;
    }
    printf("%d\n",count+1);
    return 0;
}

为什么  运行中有错误  


最佳答案

查看完整内容

内存访问越界,更改后的代码
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-18 22:37:30 | 显示全部楼层
内存访问越界,更改后的代码

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     int tree[10001];
  5.     int L,M,i,j,t;
  6.     int begin,end;
  7.     // 有10001个内存单元,但是你访问到10002去了
  8.     // 这里用把i改成i-1就行了
  9.     for(i=1;i<=10001;i++)
  10.         tree[i-1]=1;                      //先把全部都赋值为1
  11.     scanf("%d %d",&L,&M);

  12.     for(i=1;i <= M;i++)
  13.     {
  14.         scanf("%d %d",&begin,&end);
  15.         if(begin>end)              //容错处理
  16.         {
  17.             t=begin;
  18.             begin=end;
  19.             end=t;
  20.         }
  21.         for(j=begin;j <= end;j++)        //把输入的范围赋值为0
  22.             tree[j]=0;
  23.     }
  24.     int count=0;
  25.     for(i=1;i <= L;i++)
  26.     {
  27.         if(tree[i]==1)             //  统计剩余的范围
  28.             count++;
  29.     }
  30.     printf("%d\n",count);
  31.     return 0;
  32. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-18 23:10:20 | 显示全部楼层
我用c++试了,可以得出正确答案。。只是在程序结束后,会弹出运行问题的框。也许在释放时出了问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-19 09:43:44 | 显示全部楼层
for(i=1;i<=10001;i++)
        tree=1;                      //先把全部都赋值为1
这个地方错了。。。数组是从0开始的 0---10000
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-3-19 19:04:03 | 显示全部楼层
#include <stdio.h>

int main()
{
        long int L, M, i, lefttree, movtree = 0;
        long int begin,end;
        long int movetree[200] = {0};
       
        printf("请在1到10000输入范围内输入马路长度L,1到200范围内输入区域个数M以空格隔开:");
        scanf("%ld%ld", &L, &M);
        for (i = 0; i < M; i++)
        {
                printf("请输入区域的起始点begin和终止点end空格隔开:");
                scanf("%ld%ld", &begin, &end);

                if (begin > end)
                {
                        begin = begin ^ end;
                        end = begin ^ end;
                        begin = end ^ begin;
                }

                movetree[i] = end - begin;     //每个区域要移走的树木数量。
        }
       
        for (i = 0; i < M; i++)
        {
                movtree = movtree + movetree[i];   //一共要移走多少树木
        }

        lefttree = L - movtree;
        printf("剩下树的数量为:%ld\n\n",lefttree);

        return 0;
}

这个是没有考虑区域重合的情况。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-12 04:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表