【題目大意】:
就是說在一條直線道路上有n個石頭,往前走,遇到一個數一個,如果遇到的是第奇數個那就把這個石頭往前扔距離dis[i], 如果是第偶數個,就放置不管。
問人走到最後一個石頭的位置距原地多遠(遇到的最後一個石頭距離出發點的位置是多少)。
【思路】模擬即可,遇到第奇數個石頭,就將其加上dis[i],放回到優先隊列(priority_queue)中,然後再去掉一個石頭
代碼:
/* * Problem: HDU No.1896 * Running time: 280MS * Complier: G++ * Author: javaherongwei * Create Time: 14:00 2015/9/17 星期四 */ #include#include #include #include #include using namespace std; struct node { int codr; int dis; bool operator <(const node t)const //小的優先級大 { if(t.codr!=codr) return codr>t.codr; return dis>t.dis; } }ST; priority_queue que; int main() { int t;scanf(%d,&t); while(t--) { int n;scanf(%d,&n); while(!que.empty()) que.pop(); for(int i=1; i<=n; ++i) { scanf(%d %d,&ST.codr,&ST.dis); que.push(ST); } int ll=1; while(!que.empty()) { ST=que.top();que.pop(); if(ll&1) //將奇數的石頭求和距離,每次求和完重新扔進隊列中 { ST.codr+=ST.dis; que.push(ST); } ll++; } printf(%d ,ST.codr); } return 0; }