1. 程式人生 > >poj3190 區間貪心 + STL

poj3190 區間貪心 + STL

題意:n頭任性的牛,每頭牛都要在自己的時間段裡擠奶,問最少用多少個擠奶槽並輸出每頭牛所在的擠奶槽的編號(從1開始)

思路:目標明確,求最少用多少奶槽,並輸出如何分配,明顯區間貪心,找貪心的方向,就是對時間的最末端進行貪心。

簡單來說,先把奶牛們的時間輸入並按開始時間進行排序,然後依次把有序的時間段都放入堆中,在此過程中每次取出堆中末端時間最小的和當前放入堆的時間段進行比較,如果能放到同一個槽就放,反之開闢一個新槽,最終得出結果。

程式碼:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>

using namespace std;
struct Node{
    int l;
    int r;
    int id;   //第幾頭牛
    int rk;   //第幾個槽
};
Node a[51000];
int n;
struct cmp{
    bool operator()(Node &a,Node &b)
    {
        if(a.r != b.r)
            return a.r > b.r;
        else
            return a.l > b.l;
    }
};
int cmp1(Node a,Node b)
{
    if(a.l != b.l)
        return a.l < b.l;
    return a.r < b.r;
}
int cmp2(Node a,Node b)
{
    return a.id < b.id;
}
void input()
{
    for(int i = 0 ; i < n ; i++){
        cin >> a[i].l >> a[i].r;
        a[i].id = i;
    }

}
void solve()
{
    int ans = 1;
    sort(a,a+n,cmp1);
    priority_queue <Node , vector<Node> , cmp > q;
    a[0].rk = 1;
    q.push(a[0]);
    for(int i = 1 ; i < n ; i++)
    {
        Node t = q.top();

        if( a[i].l > q.top().r )
        {
            a[i].rk = t.rk;
            q.pop();
        }
        else{
            a[i].rk = ++ans;
        }
        q.push(a[i]);

    }
    sort(a,a+n,cmp2);
    cout << ans <<endl;
    for(int i = 0 ; i < n ; i++)
        cout<< a[i].rk <<endl;
}
int main()
{
    #ifdef H_R
        freopen("in.txt","r",stdin);
    #endif // H_R
    cin.tie(false);
    ios::sync_with_stdio(false);
    while(cin>>n)
    {
        input();
        solve();
    }
    return 0;
}


相關推薦

poj3190 區間貪心 + STL

題意:n頭任性的牛,每頭牛都要在自己的時間段裡擠奶,問最少用多少個擠奶槽並輸出每頭牛所在的擠奶槽的編號(從1開始) 思路:目標明確,求最少用多少奶槽,並輸出如何分配,明顯區間貪心,找貪心的方向,就是對時間的最末端進行貪心。 簡單來說,先把奶牛們的時間輸入並按開始時間進行排序

poj3190 區間貪心

2018-2-1 主要就是使用貪心,每次儘量多的安排多的奶牛,然後與之前的區間貪心不同的是,這裡是需要多次的直到所有的奶牛都安排完畢。 但是不知道為什麼一直TLE,暫時還沒有AC,只是把程式碼貼在這

CF 990B B. Micro-World【數組操作/貪心/STL/二分搜索】

putc 最終 http world [] HR name AC end 【鏈接】:CF 【題意】:對任意一個數a[i] ,可以對任意 滿足 i != j 且 a[i] > a[j] && a[i] <= a[j] +k 的 a[j] 可以被刪掉

POJ 1089 Intervals【合並n個區間/貪心

repr 貪心 bsp orm code map long long ble iostream There is given the series of n closed intervals [ai; bi], where i=1,2,...,n. The sum of t

區間貪心

題目大意:以x軸為分界,y>0部分為海,y<0部分為陸地,給出一些島嶼座標(在海中),再給出雷達可達到範圍,雷達只可以安在陸地上,問最少多少雷達可以覆蓋所以島嶼 本題貪心思路是把點轉化為在x軸座標上的區間(即能保證覆蓋該小島的雷達所有可能位置的集合),然後按點的順序排也行,按左端點排也行

演算法筆記_區間貪心

即所謂的區間不相交問題:給出N個開區間(x,y),從中選擇儘可能多的開區間,使得這些開區間兩兩沒有交集,問最多找到多少個區間? 思路:總選擇左端點最大的區間,若左端點一樣,就選右端點最小的. 給出如下例項程式碼: #include<iostream> #include<

Radar Installation POJ - 1328 (區間貪心)

https://vjudge.net/problem/POJ-1328 一道比較基礎的貪心題目, 比較巧妙的是題中用到了區間貪心的演算法. 起初看題的時候一直有一個誤區, 總想通過分析雷達關於島的位置來確定範圍, 後來發現其實加上一點兒逆向思維, 通過考慮島來確定雷達的範圍其實會更簡單

1328 區間貪心

主要的思路就是將這個題目轉換一下去求。題目上面說,雷達只會在x軸上面,那麼我們就可以去算一下大致的幾種情況: 第一種,雷達全面覆蓋的到。那麼轉換一下思路。 第二種,存在幾個特殊的,比較高的位置,雷達無法覆蓋,就是雷達最高為m,但是他的位置高度超過了m,所以直接輸出-1. 思路就是我們可以

區間貪心問題小結(區間選點,區間覆蓋,區間選取)

貪心演算法 思想:什麼是貪心演算法,什麼算得上是貪心 貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,只做出在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪

區間貪心演算法

區間選點 區間貪心的套路就是對已有資料按某以特定屬性排序,反逐個訪問這些資料,判斷出最優解 數軸上有N個閉區間[Ai, Bi]。取儘量少的點,使得每個區間內都至少有一個點(不同區間內含的點可以是同一個)。什麼是閉區間 輸入 第1行:一個整數N(1 <= N <=100

nyoj 1036-非洲小孩 (區間貪心)

這是一道區間貪心問題中的區間選點問題, 即給定部分割槽間, 選得最少的點, 使得每個區間至少有一個點(含重疊) 應該來說有兩種演算法 一是左端點排序(<), 考慮右端點(<), 然後求交集的右邊界, 沒有交集就ans+1 //非洲的小孩 貪心 #in

選擇不相交區間(貪心)

記憶體限制:64MB 時間限制:1000ms 題目描述:   好吧。這道題的目的在於讓大家認識貪心問題的三個區間經典問題:區間選點問題,區間覆蓋問題,以及該題的選擇不相交區間問題。有許多的貪心問題可以轉化為這三類的問題。 那麼,對於該問題。就是給一系列的區間,求最

Codeforces 629B Far Relative’s Problem(簡單區間貪心)

B. Far Relative’s Problem time limit per test  2 seconds memory limit per test  256 megabytes input  standard input output  stan

(一般)POJ-1328 區間貪心,幾何

題目大意:以x軸為分界,y>0部分為海,y<0部分為陸地,給出一些島嶼座標(在海中),再給出雷達可達到範圍,雷達只可以安在陸地上,問最少多少雷達可以覆蓋所以島嶼。 分析:這裡首先說一

HDU 4268 Alice and Bob(貪心+STL

該題一開始我用multiset寫了一發,寫的比較裸,TLE了 。 後來隊友想到了一個比較好的方法 :將兩個結構體排序之後,從大到小列舉Alice的h,對於每個h,將Bob中滿足h小於當前h的牌的w加進multiset,然後用二分函式查詢一下大於等於當前w的第一個數,當前迭代

POJ 3190 Stall Reservations-奶牛分欄(區間貪心,優先佇列)

題目大意:每一隻奶牛要求在時間區間[A,B]內獨享一個牛欄。問最少需要多少個牛欄。 貪心策略是優先滿足A最小的奶牛,維持一個牛欄B最小堆,將新來的奶牛塞進B最小的牛欄裡。 <p><span style="color: rgb(51, 51, 51);

(不易)POJ-3190 區間貪心

題目大意:一些奶牛要在指定的時間內擠牛奶,而一個機器只能同時對一個奶牛工作。給你每頭奶牛的指定時間的區間,問你最小需要多少機器。 分析:先按開始時間從早到晚對區間排序(記為cow[]),然後維護

3個典型區間貪心問題(總結篇)

  1.數軸上有n個閉區間[ai,bi]。取儘量少的點,使得每個區間內都至少有一個點(不同區間內含的點可以是同一個)。   2.數軸上有n個開區間(ai,bi)。最多能有多少個互不相交的區間?   3.數軸上有n個區間[ai,bi],選擇儘量少的區間覆蓋一條指定線段[s,t

【51NOD—貪心演算法專題】 E 做任務三 區間貪心+不相交子區間最少人數

做任務三  基準時間限制:1 秒 空間限制:131072 KB 分值: 5 B君和m個人一起,要完成n個任務,在這個題中,B君和m個人,什麼都不做。 第i個任務有一個開始時間s[i]和結束時間e[

Codeforces Round #595 (Div. 3)D1D2 貪心 STL

一道用STL的貪心,正好可以用來學習使用STL庫 題目大意:給出n條可以內含,相交,分離的線段,如果重疊條數超過k次則為壞點,n,k<2e5 所以我們貪心的想我們從左往右遍歷,如果重合部分條數超過了k,就必須去除線段,(此時從左邊看去除線段後不會出現衝突,右邊還有剩餘很多線段未知)所以我們選擇去除這些重