1. 程式人生 > >SDNUOJ 1092

SDNUOJ 1092

Description
某校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米。我們可以把馬路看成一個數軸,馬路的一端在數軸0的位置,另一端在L的位置;數軸上的每個整數點,即0,1,2,……,L,都種有一棵樹。
由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表示。
已知任一區域的起始點和終止點的座標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上還有多少棵樹。
Input
輸入的第一行有兩個整數:L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表馬路的長度,M代表區域的數目,L和M之間用一個空格隔開。接下來的M行每行包含兩個不同的整數(小於2147483648),用一個空格隔開,表示一個區域的起始點和終止點的座標。
Output
輸出包括一行,這一行只包含一個整數,表示馬路上剩餘的樹的數目。
Sample Input
500 3
150 300
100 200
470 471
Sample Output
298

看群裡聊天記錄看到在討論這題,本來不會做,聽他們一說就按照他們的做法去做了,也是一種思想…

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

bool area[10005];

int main()
{
    int l, n;
    int a[1005];
    int b[1005];
    cin >> l >> n;
    int max_b = 0;
    int min_a = 1000000;
    for(int i = 0; i < n; ++i)
    {
        scanf("%d%d", &a[i], &b[i]);
        if(min_a > a[i])
            min_a = a[i];
        if(max_b < b[i])
            max_b = b[i];
    }
    for(int i = 0; i < n; ++i)
    {
        for(int j = a[i]; j <= b[i]; ++j)
        {
            area[j] = 1;
        }
    }
//    cout << min_a << " " << max_b << '\n';
    bool word = 0;
    int sum = 0;
    int start;
    int over;
    for(int i = min_a; i < max_b + 5; ++i)
    {
        if(word == 0 && area[i] == 1)
        {
            start = i;
//            cout << start << '\n';
            word = 1;
            continue;
        }
        if(area[i] == 0 && word == 1)
        {
            over = i - 1;
//            cout << over << '\n';
            sum += over - start + 1;
            word = 0;
            continue;
        }
    }
    cout << l - sum + 1 << '\n';
    return 0;
}