捉襟见肘,大佬救救,我已经不知道自己错哪里了

P1047 [NOIP2005 普及组] 校门外的树

corecode @ 2022-08-28 15:30:19

#include<stdio.h>
int main()
{
    int m,l,a[2]/*u,v*/,b[10000]/*将l分成若干个整数*/,n=0/*剩余树木*/,i,j;
    for(i=0;i<=l;i++)
        b[i]=0;
    scanf("%d%d",&l,&m);
    for(i=1;i<=m;i++)
    {
        for(j=0;j<=1;j++)
        {
            scanf("%d",&a[j]);
        }
        for(i=0;i<=l;i++)
            if(i>=a[0]&&i<=a[1])//比较l内一整数是否在区间【a[0],a[1]】内
            {
                b[i]=1;//有重复区域的题目宜赋值,而不易直接加减 
            }
    }
    for(i=0;i<=l;i++)
    {
        if(b[i]=0)
        n++;
    }
    printf("%d",n);
    return 0;
}

by Jim777 @ 2022-08-28 15:39:13

这道题我之前写过,先拿去参考一下吧。

#include<iostream>
using namespace std;
int arr[10005];
int l,m,u,v,sum=0;
int main(){
    cin>>l>>m;
    for(int i=1;i<=m;i++){
        cin>>u>>v;
        for(int j=u;j<=v;j++){
            arr[j]=1;
        }
    }
    for(int i=0;i<=l;i++){
        if(arr[i]==0){
            sum++;
        }
    }
    cout<<sum;
    return 0;
}

by Jim777 @ 2022-08-28 15:40:32

这道题可以用索引的角度去写


by Cubic @ 2022-08-28 15:50:28

#include<iostream>
using namespace std;
int n, b, l, r, cnt, a[10001];
int main(){
  cin >> n >> b;
  for(int i = 0; i <= n; i++){
      a[i] = 1;
  }
  for(int i = 0; i < b; i++){
    cin >> l >> r; //起始点为l,终止点为r
    for(int j = l; j <= r; j++){ //标记第l棵树到第r棵树(如题意:种过的树)
       a[j] = 0;
    }
  }
  for(int i = 0; i <= n; i++){
    if(a[i] == 1){ //只要这棵树没被标记(种)过,就把用来统计的变量++
      cnt++;
    }
  }
  cout << cnt;
  return 0;
}

很抱歉蒟蒻看不懂您的代码,真的很想帮您改,写了注释,我个人认为我自己的代码挺好理解的


by Cubic @ 2022-08-28 15:51:30

@corecode


by Cubic @ 2022-08-28 15:55:04

您的"for(j = 0; j <= 1; j++)"是不是写错了?


by WZWZWZWY @ 2022-08-28 16:21:13

在康你的程序之前,不得不吐槽两句:


by WZWZWZWY @ 2022-08-28 16:29:42

还有,for(i……)的内层还用for(i……),会改变外层循环的值,可能会导致只进行一次


by WZWZWZWY @ 2022-08-28 16:41:51

小小地修改了一下

#include<stdio.h>
int main()
{
    int m,l,b[10001],n=0,i,j,k,q;
    scanf("%d",&l);//你应该在这里输入l
    for(i=0;i<=l;i++)
        b[i]=0;
    scanf("%d",&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&j,&k);
        for(q=0;q<=l;q++)
            if(q>=j&&q<=k)//比较l内一整数是否在区间【j,k】内
            {
                b[q]=1;
            }
    }
    for(i=0;i<=l;i++)
    {
        if(b[i]==0)//不能是b[i]=0
        n++;
    }
    printf("%d",n);
    return 0;
}

当然还可以再优化,把

   for(q=0;q<=l;q++)
        if(q>=j&&q<=k)
        {
            b[q]=1;
        }

改成:

  for(q=j;q<=k;q++)
                  b[q]=1;

祝你学习进步! @corecode


by corecode @ 2022-08-28 18:41:15

@WZRYWZWY 为什么10000要改成10001


by corecode @ 2022-08-28 18:51:28

@WZRYWZWY ```c for(i=1;i<=m;i++) { scanf("%d%d",&j,&k); for(q=0;q<=l;q++) if(q>=j&&q<=k)//比较l内一整数是否在区间【j,k】内 { b[q]=1; } }


这一段是说在循环的时候j,k就可以变而不需要用到数组吗

| 下一页