POJ 2051 argus(简单题,堆排序or优先队列)

又是一道数据结构题,使用堆来进行权值调整和排序,每次调整都是o(n)的复杂度,非常高效。

第一眼看题觉得可以用优先队列来做,应该也很简单。

事实上多数优先队列都是通过堆来实现的。

写的时候还是出了一些问题:

1、二叉树根节点下标显然不能为0;

2、限界之后若出现扩界要小心;

3、在迭代循环比较的时候,尤其注意到底比较的是谁,别把自己绕晕了。

ac代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
//纠错方法:带简单样例进去跑,打印错误位置
//二叉树注意编号从1开始
//限界之后扩界敏感
struct node{
    int now,no,period;
};
const int maxn=3005;
node n[maxn];
void down(int p,int len){
    int q=p*2;
    node a=n[p];
    while(q<len){
    //这里出现死循环,因为我的二叉树是从0开始编号的,而很明显 0*2^n=0; 有点智障的bug
        if(q+1<len){//这句不能少(限界之后扩界需要再判定越界)
            if(n[q].now>n[q+1].now){
               q++;
            }
            else if(n[q].now==n[q+1].now&&n[q].no>n[q+1].no){
               q++;
            }
        }

        //if(n[q].now>n[p].now){//比较对象到底是谁 !
        if(n[q].now>a.now){
            break;
        }
        else if(n[q].now==a.now&&a.no<n[q].no){//是a在比较
            break;
        }

        n[p]=n[q];
        p=q,q=2*p;
    }
    n[p]=a;
}
void makeMinheap(int len){
    for(int j=(len-1)/2;j>=1;j--){
        //cout<<j<<endl;
        down(j,len);
    }
}

int main(void){
    string s;
    cin>>s;
    int i=1;
    while(s[0]!=‘#‘){
        cin>>n[i].no>>n[i].period;
        n[i].now=n[i].period;
        i++;
        cin>>s;
    }
    int len=i;
    int l;
    cin>>l;
    makeMinheap(len);
    while(l--){
        cout<<n[1].no<<endl;
        n[1].now+=n[1].period;
        down(1,len);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/KYSpring/p/8723933.html

时间: 2024-08-10 04:29:48

POJ 2051 argus(简单题,堆排序or优先队列)的相关文章

poj 2051 Argus(优先队列)

题目链接: http://poj.org/problem?id=2051 思路分析: 优先级问题,使用优先队列求解:当执行某个任务后,再增加一个任务到队列中, 该任务的优先级为执行任务的时间加上其时间间隔,如此反复直到求出前K个执行任务. 代码: #include <iostream> #include <queue> using namespace std; struct Argu { int QNum; int period; int time; bool operator&l

poj 2051.Argus 解题报告

题目链接:http://poj.org/problem?id=2051 题目意思:题目有点难理解,所以结合这幅图来说吧---- 有一个叫Argus的系统,该系统支持一个 Register 命令,输入就是类似样例中的: Register 2004 200 代表编号为 2004 的 Register,每隔 200 个时间单位就会产生一次.2005 同理.然后需要输出前 k 个事件.如果多个事件同时发生,就先输出编号较少的.所以在 600 这个时间上,2004 要比 2005 先输出. 第一次学 rj

POJ 3094 Quicksum(简单题)

[题意简述]:题意很简单.看例子就能理解 [分析]:略.字符串的读取操作. // 200K 0Ms #include<iostream> using namespace std; int main() { char a[256]; while(1) { int sum = 0; gets(a); if(strcmp(a,"#")==0) break; int len = strlen(a); for(int i = 0;i<len;i++) { if(a[i] ==

Poj 2051 Argus

题意理解: (1)每个注册用户均有一个注册ID和一个时间间隔 (2)针对每隔用户,每隔一个自己的时间间隔该ID打印一次 (3)#说明输入到结尾处,没有用户注册了 (4)最后一行的数字为打印的次数 使用了一个优先权队列,把所有的注册用户放入该队列中,队列的排序按照要出现的时间从小到大排序,如果时间有冲突就按照id升序.每次这个用户id输出后,先把该用户从队列里pop出来,然后把该用户的出现时间加上他的时间间隔,然后再push到优先权队列中,由于这个队列是按照要求排序的,所以每次在队头的那个元素就是

POJ 2393 贪心 简单题

有一家生产酸奶的公司,连续n周,每周需要出货numi的单位,已经知道每一周生产单位酸奶的价格ci,并且,酸奶可以提前生产,但是存储费用是一周一单位s费用,问最少的花费. 对于要出货的酸奶,要不这一周生产,要不提前生产. 什么时候采用什么生产方式呢? 若第i周的货提前生产的话,假设在j周生产,则费用为(i-j)*s+c[j] 若c[i]>(i-j)*s+c[j],则更新c[i]=(i-j)*s+c[j] 更新要O(n^2)? 可以证明,最优的生产方式是,要不在这一周生产,要不在上一周生产(这里的上

poj 3270 Cow Sorting 置换群 简单题

假设初始状态为 a:2 3 1 5 4 6 则目标状态为 b:1 2 3 4 5 6且下标为初始状态中的3 1 2 4 5 6(a[3],a[1]...) 将置换群写成循环的形式 (2,3,1),(5,4),6就不用移动了. 移动方式2种 1:选循环内最小的数和其他len-1个数交换 2:选整个序列最小的数和循环内最小的数交换,转到1,再换回来. #include<cstdio> #include<queue> #include<algorithm> #include&

poj 3112 Digital Biochemist Circuit(简单题)

题目链接:http://poj.org/problem?id=3112 Digital Biochemist Circuit Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 876   Accepted: 375 Description A digital biochemist circuit (DBC) is a device composed of a set of processing nodes. Each pro

POJ Frogs&#39; Neighborhood havel-hakimi定理 (简单题)

Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 8263   Accepted: 3504   Special Judge Description 未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N).如果湖泊Li和Lj之间有水路相连,则青蛙Fi和Fj互称为邻居.现在已知每只青蛙的邻居数目x1, x2, ..

POJ 2405 Beavergnaw (计算几何-简单题)

Beavergnaw Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6203   Accepted: 4089 Description When chomping a tree the beaver cuts a very specific shape out of the tree trunk. What is left in the tree trunk looks like two frustums of a co