• D. Leaving Auction 一题很好的思维题


    http://codeforces.com/contest/749/problem/D

    现在发现做题要把样例抄下来,然后画一画,这样才容易发现新大陆。嗯,以后做题就这样。

    如果排除了被删除了的人,那么,剩下的人中,胜出的,就是剩下出价最高的那个,但是它有可能不需要出价那么高,所以只需要比现在剩下的人中,出价第二高的那个人的出价最大值大就可以了。

    所以每次只需要找出两个人,即可。

    这题学到了,对一个数组排序,还可以依赖其他数组来排。

    比如我用per[i]表示排名第i的那个人的id。如果要按它出价最高来排序,只需要在cmp函数上修改下就好。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <assert.h>
    #define IOS ios::sync_with_stdio(false)
    using namespace std;
    #define inf (0x3f3f3f3f)
    typedef long long int LL;
    
    
    #include <iostream>
    #include <sstream>
    #include <vector>
    #include <set>
    #include <map>
    #include <queue>
    #include <string>
    const int maxn = 200000 + 20;
    int mx[maxn];
    vector<int>each[maxn];
    int per[maxn];
    int lef[maxn];
    set<int>ss;
    bool cmp(int a, int b) {
        return mx[a] < mx[b]; //学到了,可以根据这样来排序
    }
    void work() {
        int n;
        cin >> n;
        for (int i = 1; i <= n; ++i) {
            int id, val;
            cin >> id >> val;
            per[i] = i;
            mx[id] = val;
            each[id].push_back(val);
            ss.insert(id);
        }
        sort(per + 1, per + 1 + n, cmp);
    //    for (int i = 1; i <= n; ++i) {
    //        cout << per[i] << " ";
    //    }
    //    cout << endl;
        int q;
        int DFN = 0;
        cin >> q;
        while (q--) {
            ++DFN;
            int gg;
            cin >> gg;
            for (int i = 1; i <= gg; ++i) {
                int x;
                cin >> x;
                lef[x] = DFN;
            }
            int temp[5] = {0};
            int lentemp = 0;
            for (int i = n; i >= n - ss.size() + 1; --i) {
                if (lef[per[i]] == DFN) continue;
                temp[++lentemp] = per[i]; //存id
                if (lentemp == 3) break;
            }
    //        cout << lentemp << endl;
            if (lentemp == 0) {
                cout << 0 << " " << 0 << endl;
            } else if (lentemp == 1) {
                cout << temp[1] << " " << each[temp[1]][0] << endl;
            } else {
                int ans = upper_bound(each[temp[1]].begin(), each[temp[1]].end(), mx[temp[2]]) - each[temp[1]].begin();
                cout << temp[1] << " " << each[temp[1]][ans] << endl;
            }
        }
    }
    
    int main() {
    #ifdef local
        freopen("data.txt", "r", stdin);
    //    freopen("data.txt", "w", stdout);
    #endif
        IOS;
        work();
        return 0;
    }
    View Code
  • 相关阅读:
    ASP.NET---创建自定义Web控件小结
    ASP.NET---使用Asp.NET开发三层架构的应用程序
    poj 1847 最短路简单题,dijkstra
    HDU 1102 最小生成树裸题,kruskal,prim
    poj 2239 二分图最大匹配,基础题(待补)
    HDU 1520 树形dp裸题
    HDU 2089 简单数位dp
    poj 3254 状压dp入门题
    HDU 1710 二叉树遍历,输入前、中序求后序
    Poj 3250 单调栈
  • 原文地址:https://www.cnblogs.com/liuweimingcprogram/p/6209517.html
Copyright © 2020-2023  润新知