hdu1896 bjfu1268 水题

很简单的模拟,我是用的优先队列。不多说,上代码(这是bjfuoj的,hdu的要稍改一下):

/*
 * Author    : ben
 */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <functional>
#include <numeric>
#include <cctype>
using namespace std;

typedef struct Stone {
    int p, d;
    Stone(int pp, int dd) {
        p = pp;
        d = dd;
    }
} Stone;

inline bool operator<(const Stone &s1, const Stone &s2) {
    if (s1.p != s2.p) {
        return s1.p > s2.p;
    }
    return s1.d > s2.d;
}

//输入非负整数,用法int a = get_int();
int get_int() {
    int res = 0, ch;
    while (!((ch = getchar()) >= '0' && ch <= '9')) {
        if (ch == EOF)
            return -1;
    }
    res = ch - '0';
    while ((ch = getchar()) >= '0' && ch <= '9')
        res = res * 10 + (ch - '0');
    return res;
}


int main() {
    int n, p, d, ans;
    bool flag;
    while ((n = get_int()) > 0) {
        priority_queue<Stone> pq;
        for (int i = 0; i < n; i++) {
            p = get_int();
            d = get_int();
            pq.push(Stone(p, d));
        }
        ans = 0;
        flag = true;
        while (!pq.empty()) {
            Stone s = pq.top();
            ans = s.p;
            pq.pop();
            if (flag) {
                s.p += s.d;
                pq.push(s);
            }
            flag = !flag;
        }
        printf("%d\n", ans);
    }
    return 0;
}

 

posted @ 2015-01-30 17:46  moonbay  阅读(184)  评论(0编辑  收藏  举报