做游戏
当玩家进入游戏俱乐部时,会得到一张列举了今日开放的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;
}
如有错误之处,还请不吝赐教。
这种方法似乎是错误的,应该利用贪心算法。。。。