救,逻辑上哪里有问题阿?

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

None_g @ 2023-05-14 17:29:27

用的题解里ChargeDonkey大佬的思路

思路:

第一遍,将路上的所有树打上标记,表示这个点没有被访问过。

第二遍,读入区间的头和尾,从这个区间的头开始循环,到尾结束,标记为访问过。

第三遍,顺序访问路上的树,只要没访问过,计数加1,这样就求出了路上所有还存在的树的数目。

编了个代码,又改了改,如下

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[10001],b[10001],c[10001];
    int x,l,m,i,j;
    cin>>l>>m; 
    for (i=0;i<=m;i+=2)
    {
    cin>>c[i]>>c[i+1];  
    }//c[i]为一个区域的起始点和终止点的坐标。
    for (i=0;i<=l;i+=2)
    a[i]=1;
    for (i=0;i<=l;i+=2)
    {
        for (j=c[i];j<=c[i+1];j+=2)
        {
        a[j]=0;
        }
    }
    for (i=0;i<=l;i++)
    {
    if (a[i]==1)
    x=x+1;
    }
    cout<<x;
    return 0; 
}

全部WA,求救(悲


by sjy_2023 @ 2023-05-14 17:33:25

for (i=0;i<=l;i+=2)
    a[i]=1;

i+=2 ? ? ?


by sjy_2023 @ 2023-05-14 17:34:48

循环好像都写成+=2了


by None_g @ 2023-05-14 17:36:28

@zwbsszd 改成了

i++

但还是不行(悲


by sjy_2023 @ 2023-05-14 17:37:01

坐标最好分两个数组存


by sjy_2023 @ 2023-05-14 17:44:10

读入坐标是从1开始


by sjy_2023 @ 2023-05-14 17:55:05

哦知道了

找坐标的外层循环也从1开始

而且是到m 不是l


by sjy_2023 @ 2023-05-14 17:55:35

AC:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[10001],b[10001],q[10001],w[10001];
    int x=0,l,m,i,j;
    cin>>l>>m; 
    for (i=1;i<=m;i++)
    {
        cin>>q[i]>>w[i];  
    }
    for (i=0;i<=l;i++)
        a[i]=1;
    for (i=1;i<=m;i++)
    {
        for (j=q[i];j<=w[i];j++)
        {
            a[j]=0;
        }
    }
    for (i=0;i<=l;i++)
    {
        if (a[i]==1)
            x++;
    }
    cout<<x;
    return 0;
}

by sjy_2023 @ 2023-05-14 17:57:31

@3316084249z


by None_g @ 2023-05-14 21:01:08

@zwbsszd 欸嘿,谢谢大佬,照着思路改了改,全AC

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[10001],b[10001],c[10001];
    int x,l,m,i,j;
    x=0;
    cin>>l>>m; 
    for (i=1;i<=m+1;i++)
    {
    cin>>b[i]>>c[i];    
    }//b[i] c[i]为一个区域的起始点和终止点的坐标。
    for (i=0;i<=l;i++)
    a[i]=1;
    for (i=1;i<=m;i++)
    {
        for (j=b[i];j<=c[i];j++)
        {
        a[j]=0;
        }
    }
    for (i=0;i<=l;i++)
    {
    if (a[i]==1)
    x=x+1;
    }
    cout<<x;
    return 0; 
}

by None_g @ 2023-05-14 21:08:52

@zwbsszd 为什么

 for (i=1;i<=m+1;i++)
    {
    cin>>b[i]>>c[i];    
    }//b[i] c[i]为一个区域的起始点和终止点的坐标。

这里

i<=m+1

在C++软件里F11运行复制粘贴题目中的输入

500 3
150 300
100 200
470 471

回车没反应,但能通过题目


| 下一页