【BZOJ1216】【HNOI2003】操作系统 双键值堆

广告:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/44499127");
}

题解:

写个结构体,重载一下小于号,然后扔优先队列里玩。

每次进来新的任务就把这段时间分给队列里的任务修改一下,然后把新的任务入队。

水题就瞎说点什么吧。

代码:

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 101000
using namespace std;
struct Eli
{
    int d,t,x,a; // 编号 入坑时间 处理时间 优先度
    bool read(){return (scanf("%d%d%d%d",&d,&t,&x,&a)!=EOF);}
    Eli(int q=0,int r=0,int e=0,int w=0):d(q),t(r),x(e),a(w){}
    bool operator < (const Eli &A)const{return a==A.a?t>A.t:a<A.a;}
}New,head;
priority_queue<Eli>pq;
int last,remain;
int main()
{
    freopen("test.in","r",stdin);

    while(New.read())
    {
        remain=New.t-last;
        while(!pq.empty())
        {
            head=pq.top(),pq.pop();
            if(head.x<=remain)
            {
                remain-=head.x;
                last+=head.x;
                printf("%d %d\n",head.d,last);
            }
            else {
                head.x-=remain;
                pq.push(head);
                last+=remain;
                remain=0;
                break;
            }
        }
        last+=remain;
        pq.push(New);
    }
    while(!pq.empty())
    {
        head=pq.top(),pq.pop();
        last+=head.x;
        printf("%d %d\n",head.d,last);
    }
    return 0;
}
时间: 2024-10-13 03:30:42

【BZOJ1216】【HNOI2003】操作系统 双键值堆的相关文章

bzoj1216: [HNOI2003]操作系统

堆. 一道模拟,不过不同的人模拟出来的效果差距很大,比方说我抄的这个就太劲了.. #include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; struct data { int n,s,t,p; data() {} data(int n,int s,int t,int p):n(n),s(s),t(t),p(p) {} bool ope

BZOJ 1216: [HNOI2003]操作系统( 优先队列 )

按题意用priority_queue模拟即可 ---------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; const int maxn = 1009; const int MOD = 10000; struct Node { int x, w, v; bool operator < (const Node &o

【BZOJ3889】【Usaco2015 Jan】Cow Routing 双键值最短路

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44064091"); } 题意: 从样例讲起. 第一行 s,t,m表示:起点,终点,m条航线. 然后m组,每组第一行len,n表示这条航线的代价, 这类似于公交车,只要用了就花这些钱,但是用多少都这些钱. 注意是单向边. 举例: 23

操作系统---栈区与堆区 转自:https://blog.csdn.net/amcp9/article/details/79597481

当一个程序运行时,其RAM存储方式是按照一定的区域划分的,以C为例 内存中的栈区处于相对较高的地址向较低的地址拓展,由操作系统决定的最高地址,所以它是一块连续的内存空间. 栈中分配局部变量空间,堆区是低地址向高地址拓展,用于分配程序员申请的内存空间.另外还有静态区是分配静态变量,全局变量空间的:只读区是分配常量和程序代码空间的:以及其他一些分区. 栈: 栈是为执行线程留出的内存空间.当函数被调用的时候,栈顶为局部变量和一些 bookkeeping 数据预留块.当函数执行完毕,块就没有用了,可能在

HNOI2003][BZOJ1216] 操作系统

1216: [HNOI2003]操作系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 499  Solved: 273[Submit][Status][Discuss] Description 写一个程序来模拟操作系统的进程调度.假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的.其中运行优先级用自然数表示,数字越大,则优先级越高.如果一个进程到达的时候CPU是空闲的,则它会一直占用CPU直到该进程结束.除非在这个过

C++中堆和栈的完全解析

内存分配方面: 堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样代码 中的delete语句才能正确的释放本内存空间.我们常说的内存泄露,最常见的就是堆泄露(还有资源泄露),它是指程序在运行中出现泄露,如果程序被关闭掉的话,操作系统会帮助释放泄露的内存. 栈:在函数调用时第一个进栈的主函数中

java的堆和栈

Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放.堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时 动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要在运行时动态分配内存,存取速度较慢. 栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享.但缺点是,存在栈中的数据大小

C语言中的堆与栈20160604

首先声明这里说的是C语言中的堆与栈,并不是数据结构中的!一.前言介绍:C语言程序经过编译连接后形成编译.连接后形成的二进制映像文件由栈,堆,数据段(由三部分部分组成:只读数据 段,已经初始化读写数据段,未初始化数据段即BBS)和代码段组成,如下图所示: 其中所谓静态,就是一定会存在的而且会永恒存在.不会消失,这样的数据包括常量.常变量(const 变量).静态变 量.全局变量等. 动态的话,就是会变化的了.动态的区域,就是堆和栈.这个栈应该称作 call stack,上面会存放函数的返回地址.

浅谈堆和栈的区别

笔者作为一个小白,对于堆和栈的概念,总是感觉很朦胧,他们认识我,而我只是偶尔见过,并没有深交 然而在计算机领域,堆栈是一个不容忽视的概念,堆栈是 两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈是个特殊的存储 区,主要功能是暂时存放数据和地址,通常用来保护断点和现场.要点:堆,队列优先,先进先出(FIFO—first in first out).栈,先进后出(FILO—First-In/Last-Out). 一般情况