30分求调

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

while_for @ 2024-11-22 19:46:39

c++11,只A了前3个点

#include<bits/stdc++.h>
using namespace std;
int a[1000000000];
int n,m;
int c,z;
int cz;
int main(){
    cin>>n>>m;
    for(int i=0;i<m;i++){
        cin>>c>>z;
        for(int i=c;i<=z;i++){
            a[i]++;
        }
    }   
    for(int i=0;i<n;i++){
        if(a[i]==0){
            cz++;
        }
    }
    cout<<cz;
    return 0;
}

by wyhwhs @ 2024-11-22 22:02:52

@while_for第三行a[10000+10]就行(比题目规定大10就行),太大可能会装不下

第15行for(int i=0;i<=n;i++){ if(a[i]==0){ cz++; } }改成i<=n,因为长度是0到n,两端都要算上,没有等号就会少算末尾那棵

萌新指导勿喷(dogs)


by wyhwhs @ 2024-11-22 22:03:37

#include<bits/stdc++.h>
using namespace std;
int a[10000+10];//数据比题目多10即可太多可能会装不下
int n,m;
int c,z;
int cz;
int main(){
    cin>>n>>m;
    for(int i=0;i<m;i++){
        cin>>c>>z;
        for(int i=c;i<=z;i++){
            a[i]++;
        }
    }
    for(int i=0;i<=n;i++){//最后一棵树没有记录到i<=n
        if(a[i]==0){
            cz++;
        }
    }
    cout<<cz;
    return 0;
}

最终代码


by while_for @ 2024-11-23 08:15:25

@wyhwhs 谢谢,这题我大号在两年半前A了,忘记怎么写了


by Dave123 @ 2024-11-24 19:38:19

@while_for 其实还有更简单的写法

#include <iostream>
using namespace std;
#include <set>

int main() {
    int l, m;
    cin >> l >> m;
    set<int> trees;
    for (int i = 0; i < m; i++) {
        int u, v;
        cin >> u >> v;
        for (int j = u; j <= v; j++) {
            trees.insert(j);
        }
    }
    cout << l + 1 - trees.size() << endl;
    return 0;
}

|