数据结构作业——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(优先队列)的主要内容,如果未能解决你的问题,请参考以下文章