zoukankan      html  css  js  c++  java
  • ZOJ 3230 Solving the Problems(数学 优先队列啊)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3230



    Programming is fun, Aaron is addicted to it. In order to improve his programming skill, he decides to solve one programming problem per day. As you know, different problems have different properties, some problems are so difficult that there are few people can solve it, while some problems are so easy that almost everyone is able to tackle it.

    Programming skill can be measured by an integer p. And all problems are described by two integers ai and biai indicates that if and only if P >= ai, you can solve this problem. bi indicates that after you solve this problem, your programming skill can be increased by bi.

    Given the initial programming skill p of Aaron, and the information of each problem, Aaron want to know the maximal programming skill he can reach after m days, can you help him?

    Input

    Input consists of multiple test cases (less than 40 cases)!

    For each test case, the first line contains three numbers: nmp (1 <= n <= 100000, 1 <= m <= n, 1 <= p <= 10000), n is the number of problems available for Aaron,mp as mentioned above.

    The following n lines each contain two numbers: ai and bi (1 <= ai <= 10000, 1 <= bi <= 10000) describe the information of the i-th problem as memtioned above.

    There's a blank line between consecutive cases.

    Output

    For each case, output the maximal programming skill Aaron can reach after m days in a line.

    Sample Input

    2 2 1
    1 2
    7 3
    
    3 1 2
    1 2
    2 3
    3 4
    

    Sample Output

    3
    5
    

    Author: ZHOU, Yilun
    Source: ZOJ Monthly, July 2009

    题意:

    给出Aaron 的初始的做题能力值,然后给出N道题:Aaron 解决这道题至少须要多少能力值a。Aaron 攻克了这道题他能添加多少能力值b!

    求M天后Aaron 的最大能力值是多少!


    PS:

    运用优先队列。分别对a和b排序一下!

    代码例如以下:

    //#pragma warning (disable:4786)
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <string>
    #include <cstdlib>
    #include <climits>
    #include <ctype.h>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <utility>
    #include <deque>
    #include <set>
    #include <map>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    const double eps = 1e-9;
    //const double pi = atan(1.0)*4;
    const double pi = 3.1415926535897932384626;
    const double e = exp(1.0);
    #define INF 0x3f3f3f3f
    //#define INF 1e18
    //typedef long long LL;
    //typedef __int64 LL;
    #define ONLINE_JUDGE
    #ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
    #endif
    struct node1
    {
        int a, b;
        node1() {}
        node1(int _a, int _b): a(_a), b(_b) {}
        bool operator < (const node1 & x) const
        {
            return a > x.a;//最小值优先
        }
    };
    struct node2
    {
        int a, b;
        node2() {}
        node2(int _a, int _b): a(_a), b(_b) {}
        bool operator < (const node2 & x) const
        {
            return b < x.b;//最大值优先
        }
    };
    int n, m, p;
    
    int main()
    {
        int a, b;
        while(~scanf("%d%d%d", &n, &m, &p))
        {
            priority_queue<node1> q1;
            priority_queue<node2> q2;
    
            for(int i = 0; i < n; i++)
            {
                scanf("%d%d", &a, &b);
                q1.push(node1(a, b));
            }
            int maxx_p = p;
            for(int i = 0; i < m; i++)
            {
                while (!q1.empty())
                {
                    int tt_a = q1.top().a;
                    int tt_b = q1.top().b;
                    if(tt_a <= maxx_p)
                    {
                        q2.push(node2(tt_a, tt_b));
                        q1.pop();
                    }
                    else
                    {
                        break;
                    }
                }
                if (q2.empty())
                {
                    break;
                }
                maxx_p += q2.top().b;
                q2.pop();
            }
            printf("%d
    ", maxx_p);
        }
        return 0;
    }
    /*
    3 1 2
    1 2
    2 3
    3 4
    3 2 2
    1 2
    2 3
    3 4
    */
    


  • 相关阅读:
    abstract修饰方法总结
    linux tar.gz zip 解压缩 压缩命令
    html5视频播放
    Response.Redirect 打开新窗体的两种方法
    Gmail POP3设置
    加壳学习笔记(二)-汇编基础
    C#-异常处理:tyr,catch,finally ---ShinePans
    cocos2d jsb 打包 Android APK
    编写你自己的单点登录(SSO)服务
    一分钟制作U盘版BT3
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6815838.html
Copyright © 2011-2022 走看看