Stones
2014-02-25 21:50
190 查看
题目是:HDU1896
题目简述:输入一堆石头,每个石头有自己所在的位置p,以及自己可以抛多远的距离d。你每遇到第奇数个石头,就把石头丢出去,第偶数个石头就不管。计算出最后一个石头它所处的位置。
解法:该题我采取的是先用优先队列对石头进行排序,然后再对每个石头进行处理,奇数石头就计算出石头的新位置在插进队列去,偶数石头就删除,最后所剩的石头的位置就是所求的位置。
Σ( ̄。 ̄ノ)ノ很久没敲代码。。。。优先队列都快忘记怎么写了。。。。复习一下:优先队列
头文件:
#include <queue>
基本操作:
empty() 如果队列为空返回真
pop() 删除对顶元素
size() 返回优先队列中拥有的元素个数
top() 返回优先队列对顶元素
在默认的优先队列中,优先级高的先出队。在默认的int型中先出队的为较大的数。
声明方式:
1、普通方法:
priority_queue<int>q;
//通过操作,按照元素从大到小的顺序出队
2、自定义优先级:
struct cmp
{
operator bool ()(int x, int y)
{
return x > y; // x小的优先级高
//也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
}
};
priority_queue<int, vector<int>, cmp>q;//定义方法
//其中,第二个参数为容器类型。第三个参数为比较函数。
3、结构体声明方式:
struct node
{
int x, y;
friend bool operator < (node a, node b)
{
return a.x > b.x; //结构体中,x小的优先级高
}
};
priority_queue<node>q;//定义方法
//在该结构中,y为值, x为优先级。
//通过自定义operator<操作符来比较元素中的优先级。
//在重载”<”时,最好不要重载”>”,可能会发生编译错误
代码如下:
View Code
题目简述:输入一堆石头,每个石头有自己所在的位置p,以及自己可以抛多远的距离d。你每遇到第奇数个石头,就把石头丢出去,第偶数个石头就不管。计算出最后一个石头它所处的位置。
解法:该题我采取的是先用优先队列对石头进行排序,然后再对每个石头进行处理,奇数石头就计算出石头的新位置在插进队列去,偶数石头就删除,最后所剩的石头的位置就是所求的位置。
Σ( ̄。 ̄ノ)ノ很久没敲代码。。。。优先队列都快忘记怎么写了。。。。复习一下:优先队列
头文件:
#include <queue>
基本操作:
empty() 如果队列为空返回真
pop() 删除对顶元素
size() 返回优先队列中拥有的元素个数
top() 返回优先队列对顶元素
在默认的优先队列中,优先级高的先出队。在默认的int型中先出队的为较大的数。
声明方式:
1、普通方法:
priority_queue<int>q;
//通过操作,按照元素从大到小的顺序出队
2、自定义优先级:
struct cmp
{
operator bool ()(int x, int y)
{
return x > y; // x小的优先级高
//也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
}
};
priority_queue<int, vector<int>, cmp>q;//定义方法
//其中,第二个参数为容器类型。第三个参数为比较函数。
3、结构体声明方式:
struct node
{
int x, y;
friend bool operator < (node a, node b)
{
return a.x > b.x; //结构体中,x小的优先级高
}
};
priority_queue<node>q;//定义方法
//在该结构中,y为值, x为优先级。
//通过自定义operator<操作符来比较元素中的优先级。
//在重载”<”时,最好不要重载”>”,可能会发生编译错误
代码如下:
#include <iostream> #include <cstdio> #include <queue> using namespace std; struct node { friend bool operator < (node n1,node n2) { if(n1.p!=n2.p) return n1.p>n2.p; else return n1.d>n2.d; } int p,d; }; priority_queue<node> q; int main() { int n,m,number; node x; scanf("%d",&n); while(n--) { scanf("%d",&m); int i; for(i=0;i<m;i++) { scanf("%d%d",&x.p,&x.d); q.push(x); } i=1; while(!q.empty()) { if(i%2) { x=q.top(); q.pop(); x.p+=x.d; q.push(x); } else { number=q.top().p; q.pop(); } i++; } cout<<number<<endl; } return 0; }
View Code
相关文章推荐
- SharePoint 2010 master page 控件介绍(4):隐藏placeholder
- 多读些demo
- 中国的事情,往往变的很快(zz)
- text段、data段和bss段介绍
- csv
- 链表指针uva11988
- 解决Elementary OS和Windows时间不一致
- 关于C#获取html代码出现404错误的解决方法
- zynq正确使用GPIO
- unsigned int 与 unsigned long 一样吗?
- 《STL源码剖析》——迭代器(iterators)概念与traits编程技法(一)
- C语言extern关键字使用
- C++解析JSON进行网络传输--一个通过JSON方式的socket传输
- 图说微积分(八)极限
- 44B0X Uart_Printf()
- 阶乘因式分解
- 桥接,NAT,Host Only的区别
- jboss:在standalone.xml中设置系统属性(system-properties)
- AssetManager
- 学习Linux驱动要求