首页 > 其他 > 详细

HDU 7068 - Dota2 Pro Circuit

时间:2021-08-17 23:03:29      阅读:19      评论:0      收藏:0      [点我收藏+]

https://acm.hdu.edu.cn/showproblem.php?pid=7068

对于一个数,最大得分时要加上b[1],最小得分加上b[n].
寻找最大排名,要对每个b[2->n]匹配一个a[y],使尽可能多的和小于b[1] + a[x]
显然从小到大枚举b[i],依次在a中找即可


const int maxn = 5e3 + 7;
int n, t, m;
int a[maxn], b[maxn], bp[maxn], wp[maxn];
vector<pair<int, int>> va;

void solve() {
    cin >> t;
    while (t--) {
        cin >> n;
        va.clear();
        for (int i = 1; i <= n; i++)
            cin >> a[i], va.emplace_back(a[i], i);

        sort(all(va));
        reverse(all(va));

        for (int i = 1; i <= n; i++)
            cin >> b[i];
        queue<int> que;
        for (int i = 0; i < n; i++) {
            while (!que.empty()) que.pop();
            for (int k = n; k >= 1; k--)
                que.push(b[k]);
            int bstsoc = va[i].first + b[1];
            int bstpl = n;
            for (auto &j:va) {
                if (j.second == va[i].second) continue;
                if (j.first + que.front() <= bstsoc) bstpl--, que.pop();
            }
            bp[va[i].second] = bstpl;

            while (!que.empty()) que.pop();
            for (int k = 1; k <= n; k++)
                que.push(b[k]);
            int wstsoc = va[i].first + b[n];
            int wstpl = 1;
            for (int p = n - 1; p >= 0; p--) {
                auto &j = va[p];
                if (j.second == va[i].second) continue;
                if (j.first + que.front() > wstsoc) wstpl++, que.pop();
            }
            wp[va[i].second] = wstpl;
        }

        for (int i = 1; i <= n; i++)
            cout << bp[i] << " " << wp[i] << endl;
    }
}

HDU 7068 - Dota2 Pro Circuit

原文:https://www.cnblogs.com/maymi/p/15154099.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!