20求调

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

AAAuc03 @ 2024-08-23 14:51:29

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int l,n,u,v;
    cin>>l>>n;
    int sum=l+1;
    for(int i=0;i<n;i++)
    {
        cin>>u>>v;
        sum-=v-u+1;
    }
    cout<<sum;
    return 0;
}

by AAAuc03 @ 2024-08-23 14:52:05

解答出来者,悬赏关注


by ___Segment___ @ 2024-08-23 14:55:50

@AAAuc03 你这个好像样例都没过。

如果两个用来建地铁的区域重叠了(比如样例),那么你的代码会重复计算。

由于没办法直接在你的代码上改,所以给出我的 AC code:

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

by w_gaoch @ 2024-08-25 21:52:09

这是我的

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

你把它抽象化成一个零一组合,1为没移走的,0就是移走的,选定每一组数据的首尾做替换即可 求关注!!


by DeImage @ 2024-08-26 17:06:05

用 bool 类型可能会容易理解一些。 建地铁的地方把值修改为 true。

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

int l, m;
bool k[10001];  //默认值为 false
int main()  {
    scanf("%d%d", &l, &m);
    for (int i = 1; i <= m; i++) {
        int a, b;
        scanf("%d%d", &a, &b);
        for (int j = a; j <= b; j++)  //开头到结尾全部改为 true
            k[j] = true;
    }
    int s = 0;
    for (int i = 0; i <= l; i++)  //看看哪些仍然为 false
        if (! k[i])
            s++;
    printf("%d", s);
}

不然只能拿 20 分,因为重复计算了


|