首页 > 代码库 > 数据结构作业——Sanji(优先队列)

数据结构作业——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(优先队列)