2021年4.19TX笔试题第三题题解

做游戏

当玩家进入游戏俱乐部时,会得到一张列举了今日开放的n个游戏的清单,其中第i个游戏必须在ti时刻内完成,进入俱乐部的时间是0时刻,任一游戏需要一个单位时间完成,若没完成则会扣除wi点荣耀积分。
给出理论上最少会被扣除多少点荣耀积分。

输入描述

第一行输入一个正整数T,代表测试数据的组数。
对于每组测试数据,第一行输入一个正整数n,代表今日开放的游戏数目。
第二行输入n个正整数,代表各个游戏的规定完成时间。
第三行输入n个正整数,代表各个游戏若没有完成会被扣除的荣耀积分。

输出描述

对于每组测试数据,一行输出一个整数(被扣除的荣耀积分)。

输入示例

1
3
3 1 1
3 6 9

输出示例

6

思路

先做时间点最小的并且扣除积分最多的。(利用优先队列排序)

代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
struct cmp
{
    bool operator() (pair<int, int>& a, pair<int, int>& b)
    {
        return (a.first > b.first) || (a.first == b.first && a.second < b.second);
    }
};
int main()
{
    int T;
    cin >> T;
    for (int count = 0; count < T; count++)
    {
        int n;
        cin >> n;
        vector<vector<int>> store(2, vector<int>(n));
        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < n; j++)
            {
                cin >> store[i][j];
            }
        }
        priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> prior;
        for (int i = 0; i < n; i++)
            prior.push(make_pair(store[0][i], store[1][i]));
        long long ans = 0;
        for (int i = 0; i <= n; i++)
        {
            if (prior.size() == 0)
                break;
            if (i < prior.top().first)
            {
                prior.pop();
                continue;
            }
            else
            {
                while (i >= prior.top().first)
                {
                    ans += prior.top().second;
                    prior.pop();
                    if (prior.size() == 0)
                        break;
                }
                i--;
            }
        }
        cout << ans;
    }
    return 0;
}

如有错误之处,还请不吝赐教。
这种方法似乎是错误的,应该利用贪心算法。。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值