201781的區間

來源:NOIP黑龍江模擬賽
代碼提交:https://qdacm.com/P/2834

可以翻閱下我的那篇前綴和概述,有驚喜

題目描述:
201781喜歡區間和平面,他有N個一維區間[xi,yi](1<=i<=N)和一個左上角座標爲(1,1)的二維平面(平面無限大)。
201781 的好奇心驅使,他想知道把這N個區間 無重疊的(左右端點也算重疊)放到二維平面上最少需要多少行?
每一個區間只能出現在一行中,不能跨行。

輸入格式
第一行是一個整數 N,代表區間的數目。
之後 N行,第 i + 1 行有兩個整數 xi, yi。其中 xi 和 yi 表示第i 個區間需要的範圍。

輸出格式
輸出一個正整數,表示最少需要佔用的行的個數。

思路:如果題目沒有限制條件區間不可重疊的話,那麼我們就cout<< 1 << endl;別癡想妄想了,這可是B題呢。
那麼題目說最少佔用行數,也就是每行的區間我要儘可能的利用。換個idea,我對每段區間[L,R],a[L] = 1.a[R+1] = -1.如果一段區間k內的前綴和爲10,說明在區間k中有10個區間a1,a2.....a10.那麼我就必須開10行,來把這些重疊在一起的區間分到每一行去。據此,我只需要記錄區間內出現的最大前綴和ans,即爲最小行數。(因爲這個最大前綴和ans說明我最少需要開ans行,才能滿足題目條件)

代碼如下:

#include <iostream>
#include <cstdio>
#include <cmath>
#define N 1000010
using namespace std;

int mp[N];
int main(){
   int n ,ans = 0 ;
   cin >> n;
   for(int i = 0 ; i < n ; i++){
        int l,r;
        scanf("%d%d",&l,&r);
        mp[l] += 1;
        mp[r+1] -= 1;
   }

   int M = 0;
   for(int i = 0 ; i < N;i++){
       M +=mp[i];
       ans = max(M,ans);
   }
    cout << ans <<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章