数据结构作业——Sanji(优先队列)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构作业——Sanji(优先队列)相关的知识,希望对你有一定的参考价值。

山治的婚约

Description

我们知道,山治原来是地下有名的杀人家族文斯莫克家族的三子,目前山治的弟弟已经出现,叫做四治,大哥二哥就叫汪(One)治跟突(Two)治好了(跟本剧情无关) 。山治知道自己跟夏洛特家族有婚约之时,决定参加大妈的茶会,跟父亲做个了断。然而夏洛特公主早已看穿了一切,她给山治出了个难题,如果山治能够解决难题,夏洛特公主就帮助山治解除婚约。公主安排了 N 只拿着蛋糕的猴子,排成一列,每只猴子都有自己的初始位置 Pi 和行动量 Di,山治从前往后夺取猴子的蛋糕,因为光谱踢技能的冷却时间太久,每干掉一直猴子,来不及对其后面的猴子下手,其后面的第一只猴子就会往后逃跑一段距离 Di,重新插入到队伍中。这时又可以对接下来的猴子动手,夺取蛋糕,公主答应只要山治知道自己夺得所有蛋糕需要移动多远,就算通过了考验。山治的幸福就交给大家了。
注:如果两只猴子在同一位置,可以看做两只猴子一前一后,初始位置小的在前假设山治的初始位置为 0

Input

第一行给出整数 N,猴子的数量
接下来 N 行,每行两个整数,Pi 和 Di
其中 0<N<=10000,并保证所有数据在 INT 范围内,保证每只猴子的初始位置都不同

Output

输出一个整数,表示山治夺得所有蛋糕需要移动多远

Sample Input

8 1
1
2 2
6 6
3 3
5 5
4 4
7 7
8 8

Sample Output

24

思路

题目给出的样例解释感觉反而会误导别人,所以就没有把它放出来。就是一排猴子,然后山治从0起点沿路下去打猴子,用优先队列模拟一下就好。

 AC代码
#include<iostream>  
#include<cstdio>  
#include<cstring>  
#include<queue>  
using namespace std;  
const int maxn = 10005;  
  
struct Node{  
    int pi,di,id;  
    bool operator <(const Node &a)const  
    {  
        if (pi == a.pi) return id > a.id;  
        return pi > a.pi;  
    }  
};  
  
int main()  
{  
    //freopen("input.txt","r",stdin);  
    int N,i;  
    priority_queue<Node>pque;  
    Node ptmp;  
    scanf("%d",&N);  
    for (i = 0;i < N;i++)  
    {  
        scanf("%d%d",&ptmp.pi,&ptmp.di);  
        ptmp.id = ptmp.pi;  
        pque.push(ptmp);  
    }  
    i = 1;  
    while (!pque.empty())  
    {  
        ptmp = pque.top();  
        pque.pop();  
        if (!i)  
        {  
            ptmp.pi += ptmp.di;  
            pque.push(ptmp);  
        }  
        i = !i;  
    }   
    printf("%d\n",ptmp.pi);  
    return 0;  
}  

  

以上是关于数据结构作业——Sanji(优先队列)的主要内容,如果未能解决你的问题,请参考以下文章

优先队列原理与实现

模拟处理机作业调度---短作业优先调度算法

数据结构作业——Fresh Meat(优先队列)

# Java 常用代码片段

# Java 常用代码片段

iOS 作业队列类似于 Path 的 android 优先级作业队列