程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 校門外的樹,校門外

校門外的樹,校門外

編輯:C++入門知識

校門外的樹,校門外


問題描述

某校大門外長度為 L 的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是 1 米。我們 可以把馬路看成一個數軸,馬路的一端在數軸 0 的位置,另一端在 L 的位置;數軸上的每 個整數點,即 0,1,2,......,L,都種有一棵樹。 由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。已 知任一區域的起始點和終止點的坐標都是整數,區域之間可能有重合的部分。現在要把這些 區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上 還有多少棵樹。

輸入數據

輸入的第一行有兩個整數 L(1 <= L <= 10000)和 M(1 <= M <= 100),L 代表馬路 的長度,M 代表區域的數目,L 和 M 之間用一個空格隔開。接下來的 M 行每行包含兩個不 同的整數,用一個空格隔開,表示一個區域的起始點和終止點的坐標。

輸出要求 輸出包括一行,這一行只包含一個整數,表示馬路上剩余的樹的數目。 輸入樣例

500 3

150 300

100 200

470 471

輸出樣例 298 

 

解法分析:

一上來第一反應是去求集合,做了個二維數組,然後被卡在合並集合上。

但是看題目的constrains,會發現L最大並不大。所以衍生出了一個簡單方法,初始設值都為1.每次section范圍置0,多次section重合置0不會影響。所以最後題目的c++解法如下:

#include <iostream>
#include <vector>
#include <numeric>
using namespace std;

int compare(vector<int>a,vector<int>b)
{
    return a[0]<b[0];
}
int main() {
    int l,m;
    cin>>l>>m;

    int *trees=new int[l+1];
    //fill the array with 1
    fill_n(trees,l+1,1);
    int start,end;
    for(int i=0;i<m;i++)
    {
        cin>>start>>end;
        for(int j=start;j<=end;j++)
        {
            trees[j]=0;
        }
    }
    //sum of trees
    cout<<accumulate(trees,trees+l+1,0);

    delete []trees;


}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved