码迷,mamicode.com
首页 > 其他好文 > 详细

bjfu1262 优先队列

时间:2015-02-08 23:14:47      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

比较典型的应用优先队列的题。题目是在一个长为n的数组中,依次问m个数中的最小值。那么把值和下标做成一个结构体,放进优先队列里,每次移动窗口就把该T的T掉,剩下的最小值就是答案,复杂度nlogn,轻松ac。

/*
 * Author    : ben
 */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <functional>
#include <numeric>
#include <cctype>
using namespace std;
/*
 * 输入非负整数
 * 支持short、int、long、long long等类型(修改typec即可)。
 * 用法typec a = get_int();返回-1表示输入结束
 */
typedef int typec;
typec get_int() {
    typec res = 0, ch;
    while (!((ch = getchar()) >= 0 && ch <= 9)) {
        if (ch == EOF)
            return -1;
    }
    res = ch - 0;
    while ((ch = getchar()) >= 0 && ch <= 9)
        res = res * 10 + (ch - 0);
    return res;
}
//输入整数(包括负整数,故不能通过返回值判断是否输入到EOF,本函数当输入到EOF时,返回-1),用法int a = get_int2();
int get_int2() {
    int res = 0, ch, flag = 0;
    while (!((ch = getchar()) >= 0 && ch <= 9)) {
        if (ch == -)
            flag = 1;
        if (ch == EOF)
            return -1;
    }
    res = ch - 0;
    while ((ch = getchar()) >= 0 && ch <= 9)
        res = res * 10 + (ch - 0);
    if (flag == 1)
        res = -res;
    return res;
}
/**
 * 输入一个字符串到str中,与scanf("%s", str)类似,
 * 会忽略掉缓冲区中的空白字符。返回值为输入字符串
 * 的长度,返回-1表示输入结束。
 */
int get_str(char *str) {
    char c;
    while ((c = getchar()) <=  ) {
        if(c == EOF) {
            return -1;
        }
    }
    int I = 0;
    while (c >  ) {
        str[I++] = c; c = getchar();
    }
    str[I] = 0;
    return I;
}
const int MAXN = 100009;
typedef struct Evil {
    int id;
    int hp;
    Evil(int ii = 0, int hh = 0) {
        id = ii;
        hp = hh;
    }
} Evil;
inline bool operator<(const Evil &e1, const Evil &e2) {
    if (e1.hp != e2.hp) {
        return e1.hp > e2.hp;
    }
    return e1.id > e2.id;
}

int data[MAXN];
int main() {
    int n, m;
    while ((n = get_int()) > 0 && (m = get_int()) > 0) {
        priority_queue<Evil> pq;
        for (int i = 0; i < n; i++) {
            data[i] = get_int();
        }
        int i = 0;
        for (; i < m; i++) {
            pq.push(Evil(i, data[i]));
        }
        printf("%d", pq.top().hp);
        for (; i < n; i++) {
            pq.push(Evil(i, data[i]));
            int j = i - m + 1;
            while (!pq.empty() && pq.top().id < j) {
                pq.pop();
            }
            printf(" %d", pq.top().hp);
        }
        putchar(\n);
    }
    return 0;
}

 

bjfu1262 优先队列

标签:

原文地址:http://www.cnblogs.com/moonbay/p/4280620.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!