Réservations Stall (un algorithme glouton) - Notes d'étude

description du problème

N-bovins (1 <= n <= 50 000 ) à traire. Compte tenu du temps chaque zone de traite de la vache
entre [A, B] (1 < = A <= B <= 1000000, A, B est un nombre entier).
Les bovins doivent rester traite corral. Un corral en même temps , il ne peut accueillir une vache.
Q. Combien de corrals au moins, pour compléter l' ensemble de la traite, et chaque tête de bétail qui ont mis le corral (jugé spécial)
à un corral avec deux vaches, qui sont traites intervalle de temps , même si le critère d' évaluation est non seulement une coïncidence possible.

algorithme glouton

Ici, toutes nos vaches ont besoin de la traite, traire une vache quand, il est nécessaire de chercher les vaches.

S (x) représente une heure de début x de vaches. E (x) indique la fin du temps x. E (x), x peuvent être des vaches, peut aussi être un corral. End Time corral la fin du temps, est qu'il ya des vaches laitières. En même temps la fin du corral est constamment variable.

Grandes lignes de la solution
1: La traite des vaches triées de l' avant à remonter le temps de démarrage
2: attribution d'une première cale vache
3: traitement séquentiellement chacun derrière vache, i vaches traitement, tenez compte assigné décrochage n'a terminé la première fois enclos x.
Lorsque la fin d'un temps de décrochage <heure de début des vaches, et non l'attribution de nouveaux stands, je peux entrer dans x et modifier l'heure de fin de décrochage E (i)
Si l'heure de fin de décrochage> = vaches commencent à temps, l' attribution d' un nouvel animal bar, E (i)
jusqu'à ce que toutes les vaches traitement se termine

points

Besoin d'utiliser la file d'attente prioritaire pour stocker corral déjà attribué, de sorte que la fin des temps et toujours au plus tôt la tête corral de la file d'attente.

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
struct Cow {//奶牛
    int a, b; //挤奶区间起终点
    int No; //编号
    bool operator<(const Cow& c) const {
        return a < c.a;//按照开始时间从早到晚排序
    }
} cows[50100];
int pos[50100]; //pos[i]表示编号为i的奶牛去的畜栏编号
struct Stall {//畜栏
    int end; //结束时间
    int No; //编号
    bool operator<(const Stall& s) const {
        return end > s.end;//按照畜栏的结束时间排序
    }
    Stall(int e, int n) :end(e), No(n) { }
};
int main()
{
    int n;
    cin>>n;
    for (int i = 0; i < n; ++i) {
        cin>>cows[i].a>>cows[i].b;
        cows[i].No = i;
    }
    sort(cows, cows + n);
    int total = 0;
    priority_queue<Stall> pq;//畜栏的队列
    for (int i = 0; i < n; ++i) {
        if (pq.empty()) {//如果畜栏为空的话,就是放入第一个畜栏
            ++total;
            pq.push(Stall(cows[i].b, total));//并且新开一个畜栏,以放入当前奶牛的结束时间为畜栏的结束时间
            pos[cows[i].No] = total;
        }
        else {
            Stall st = pq.top();//指向队列的顶端,即即将释放的畜栏
            if (st.end < cows[i].a) { //端点也不能重合////如果畜栏的结束时间早于奶牛的开始时间的话
                pq.pop();
                pos[cows[i].No] = st.No;
                pq.push(Stall(cows[i].b, st.No));
            }
            else { //对应 if( st.end < cows[i].a //畜栏的结束时间晚于奶牛的开始时间,即队列中没有可以释放的畜栏,就新开一个畜栏放入奶牛
                ++total;
                pq.push(Stall{cows[i].b,total });//畜栏结束时间设置为奶牛结束
                pos[cows[i].No] = total;
            }
        }
    }
    cout << total << endl;
    for (int i = 0; i < n; ++i)
        cout << pos[i] << endl;
    return 0;
}
Publié 97 articles originaux · louange 208 won · vues 70000 +

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45822638/article/details/105272109
conseillé
Classement