遇到第奇数块石头时,他会将其往前面扔,能扔多远在输入中会给出,而遇到第偶数个石头时不进行处理。当有两个石头在同一位置时,则先处理"射程"(能扔的距离最短)的石头,然后Sempr一直往前走,直到前面已经没有任何石头时,这时候计算Sempr与出发点的距离。
样例解析:
对于样例1的分析:一开始的时候遇到的是第一个石头,他的坐标是1,然后往前扔了5个单位之后,坐标变成6,随后继续往前走,开始遇到第二个石头(坐标是2),忽略,然后继续往前走,又遇到了原来的第一个石头(现在是第三个石头),但是它此时坐标为6,往前扔了5个单位之后,坐标变成11,然后继续往前走,一直走在坐标11时,这时候他遇到的是第四个石头,因此忽略不计。至此,前面已经没有石头了,因此此时离坐标原点的距离为11。
解题思路:
因此有了以上的分析,我们可以运用优先队列解决上述问题,先将每个石头的位置及其能够扔的距离封装成一个结构体,然后再根据小根堆的思想重载
优先队列的优先级即可。利用一个bool变量来控制奇偶,奇数时处理,偶数时不处理。
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
struct Node{
int pos;
int dis; //表示能够扔的距离
friend bool operator <(Node a,Node b){
if(a.pos==b.pos){
return a.dis > b.dis;
}
return a.pos > b.pos; //从小到大排
}
};
int main(){
int T,N;
int P,D;
scanf("%d",&T);
while(T--){
priority_queue <Node> que;
Node node;
scanf("%d",&N);
for(int i = 1;i <= N;++i){
scanf("%d %d",&node.pos,&node.dis);
que.push(node);
}
bool tmp = true; //用于切换奇偶
while(!que.empty()){
node = que.top();
que.pop();
if(tmp){
node.pos += node.dis;
que.push(node); //将扔到远方的石头继续加入队列中
}
tmp = !tmp; //偶数个不处理
}
printf("%d
",node.pos);
}
return 0;
}
这道题用了运算符重载,这是第一次试着去把它搞懂,之前看的那个博客用的是class A {public: ……}的方法,但是看不懂,之后看到有用struct A{ ……};写的,结果把之前那个改了,发现也可以。
下面这链接说了,class 与 struct 的区别:
http://blog.csdn.net/fefe82/article/details/37730545
支持运算符重载和定义新运算符的语言:
PostgreSQL的SQL方言
Ruby
Haskell
支持运算符重载的语言:
Ada
C++
C#
D
Perl
Python
Pico(某种程度上)
Pascal(仅Free Pascal Dialect)
FreeBASIC
Visual Basic(需要 Visual Basic .NET 2008 或更高版本)
不支持运算符重载的语言:
C
Delphi
Java
Objective-C