Description

Because of the wrong status of the bicycle, Sempr begin to walk east to west every morning and walk back every evening. Walking may cause a little tired, so Sempr always play some games this time.         There are many stones on the road, when he meet a stone, he will throw it ahead as far as possible if it is the odd stone he meet, or leave it where it was if it is the even stone. Now give you some informations about the stones on the road, you are to tell me the distance from the start point to the farthest stone after Sempr walk by. Please pay attention that if two or more stones stay at the same position, you will meet the larger one(the one with the smallest Di, as described in the Input) first.        
                

Input

In the first line, there is an Integer T(1<=T<=10), which means the test cases in the input file. Then followed by T test cases.         For each test case, I will give you an Integer N(0<N<=100,000) in the first line, which means the number of stones on the road. Then followed by N lines and there are two integers Pi(0<=Pi<=100,000) and Di(0<=Di<=1,000) in the line, which means the position of the i-th stone and how far Sempr can throw it.        
                

Output

Just output one line for one test case, as described in the Description.        
                

Sample Input

2
2
1 5
2 4
2
1 5
6 6
                

Sample Output

11
12
 
 
该题使用优先队列
我的思路是,先将第一个石头和其移动后的位置存入队列,再用移动后的位置与第二个石头的位置比较,若第二个石头较远,则移动第二个石头,将其原始位置和移动后的位置都存入队列。若第一个石头较远,则应与第三个石头的位置进行比较,再决定移动哪个。
这样的思路没有考虑到若同一位置石头数目较多,则代码中的一个t则无法记录同一位置多的石头的运动距离。
所以导致结果错误。
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int pi[],di[];
int main()
{
int T;
scanf("%d",&T);
while(T--){
priority_queue<int>p;
int n,m,t,s;
scanf("%d",&n);
m=n;
for(int i=;i<n;i++)scanf("%d%d",&pi[i],&di[i]);
for(int i=;i<n;i++){
if(i==){ //将第一个石头即其移动后的位置存入队列
p.push(pi[i]);
p.push(pi[i]+di[i]);
t=di[i];
}
else{
if(p.size()%==){ //队列中有偶数个石头位置
if(p.top()>pi[i]){
if(i!=n-){
if(p.top()<pi[i+]){
p.push(p.top()+t);
}
else {
p.push(pi[i]);
continue; //应与下一个石头进行比较后再决定移动队列顶端石头还是下一个石头
}
}
else{
p.push(p.top()+t);
}
}
else if(p.top()<pi[i]){
p.push(pi[i]+di[i]);
t=di[i];
}
else{ //两者位置相同时
if(di[i]<t){
if(i!=n-){
if(p.top()<pi[i+])p.push(p.top()+t);
else {
p.push(pi[i]);
continue;
}
}
else p.push(p.top()+t);
}
else{
p.push(pi[i]+di[i]);
t=di[i];
}
}
p.push(pi[i]);
}
else{
if(p.top()>pi[i]){
p.push(pi[i]+di[i]);
if(pi[i]+di[i]>p.top())t=di[i];
}
else if(p.top()<pi[i]){
if(i!=n-){
if(p.top()<pi[i+])p.push(p.top()+t);
else {
p.push(pi[i]);
continue;
}
}
else p.push(p.top()+t);
}
else{
if(di[i]<t){
p.push(pi[i]+di[i]);
t=di[i];
}
else{
if(i!=n-){
if(p.top()<pi[i+])p.push(p.top()+t);
else {
p.push(pi[i]);
continue;
}
}
else p.push(p.top()+t);
}
}
p.push(pi[i]);
}
}
}
if(p.size()%==)p.push(p.top()+t);
cout<<p.top()<<endl;
}
//system("pause");
return ;
}

解决同一位置多个(超过两个)石头的问题,应运用结构体比较简单

以下正确代码中重载“<",使队列优先级如此排列

#include<cstdio>
#include<queue>
using namespace std;
struct Stone{
int pi; //石头的初始地
int di; //石头能扔的最远距离
};
bool operator<( Stone a, Stone b )
{ //重载小于,按照结构体中x小的在队顶,如果x一样,则按照y的最小的在//队顶
if( a.pi== b.pi ) return a.di > b.di;
return a.pi > b.pi;
}
int main()
{
int t;
scanf("%d",&t);//测试数据个数
while(t--)
{
int n,i ;
priority_queue<Stone>q; //定义一个Stone成员的优先//队列
scanf("%d",&n);
Stone tmp; //结构体对象
for(i =;i<n ; i++ )
{
scanf("%d%d",&tmp.pi,&tmp.di);
q.push(tmp);
}
int sum =; //判断碰到的是第几个石头的标记
while(!q.empty()) //当队列为空就跳出循环,也就是说再//向前就没有石头可以遇到
{
tmp = q.top();
//cout<<"-"<<tmp.pi<<" *"<<endl;
q.pop(); //去队顶元素,也就是在后面的所有//石头中第一个碰到的石头
if(sum%)
{ //如果是奇数号石头,则处理,否则不做处理
tmp.pi+=tmp.di; //则向前扔y单位长度
q.push(tmp); //扔出去的石头入队
}
sum++; //石头计数+1
}
printf("%d\n",tmp.pi);
}
//system("pause");
return ;
}

V - stl 的 优先队列 Ⅱ的更多相关文章

  1. STL之优先队列

    STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素 ...

  2. STL priority_queue 优先队列 小记

    今天做题发现一个很有趣的地方,竟然还是头一次发现,唉,还是太菜了. 做图论用STL里的priority_queue去优化prim,由于特殊需求,我需要记录生成树中是用的哪些边. 于是,我定义的优先队列 ...

  3. 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动

    一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...

  4. STL中优先队列的使用

    普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出的行为特征.我们来说一下C++的 ...

  5. STL之优先队列(1)

    优先队列用法 在优先队列中,优先级高的元素先出队列. 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系. 优先队列的第一种用法: 也是最常用的用法 priority_queue< ...

  6. STL之优先队列(priority_queue)

    转自网上大牛博客,原文地址:http://www.cnblogs.com/summerRQ/articles/2470130.html 先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对 ...

  7. W - stl 的 优先队列 Ⅲ

    Description In a speech contest, when a contestant finishes his speech, the judges will then grade h ...

  8. hdu 4393 Throw nails(STL之优先队列)

    Problem Description The annual school bicycle contest started. ZL is a student in this school. He is ...

  9. hdu1716排列2(stl:next_permutation+优先队列)

    排列2 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

随机推荐

  1. java加载资源文件

    className.class.getResourceAsStream 用法: 第一: 要加载的文件和.class文件在同一目录下,例如:com.x.y 下有类Test.class ,同时有资源文件c ...

  2. 调用[[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad判断设备

    将模拟器改为Ipad时,调用[[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad判断设备是否为Ipad,但程序并 ...

  3. 剑指offier第三题

    package 剑指office; /* * 第三题二维数组查找 * 在一个二维数组中,每一行都按照从左到右递增的顺序排序, * 每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维 ...

  4. stl学习之模板

    模板是实现代码重用机制的一种工具,实质就是实现类型参数化,即把类型定义为参数. C++提供两种模板:函数模板,类模板.   template<typename T> //或者 templa ...

  5. MYSQL存储过程中-流程控制语句

    存储过程中常用的流程控制 复习下存储过程内部的语法 定义存储过程体的局部变量: 定义方法:DECLARE a INT DEFAULT 100或者DECLARE   a INT ; SET a=100; ...

  6. [Head First Python]2. python of comment

    1- 多行注释 ''' ''' 或 """ """ '''this is the standard way to include a mul ...

  7. flash播放器遮挡页面中元素问题解决

    今天在做一个包含Flash播放器的页面弹出效果时发现Flash播放器总是跑到页面最上层,发现这个问题与Flash的”wmode”属性有关,至于该元素详细此处不做记录,解决办法如下: IE:加入参数:& ...

  8. 重读LPTHW-Lesson1-14

    1.python print 可以用"Hello World",也可以用'Hello World',或者”””Hello World ””” 2.要打印在一行,可以在改行后加英文逗 ...

  9. select操作

    // 1.判断select选项中 是否存在Value="paraValue"的Item         function jsSelectIsExitItem(objSelect, ...

  10. CSS之清除浮动

    一.清除浮动的目的. 1.当一个父元素的高度不写或为auto时,而且这个父元素内又有浮动的子元素,那么这时候该父元素的高度将不会自动适应子元素的高度,也可以说高度是0px; 有如下代码: <di ...