链接:https://ac.nowcoder.com/acm/contest/1080/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
在一个游戏中,tokitsukaze需要在n个士兵中选出一些士兵组成一个团去打副本。
第i个士兵的战力为v[i],团的战力是团内所有士兵的战力之和。
但是这些士兵有特殊的要求:如果选了第i个士兵,这个士兵希望团的人数不超过s[i]。(如果不选第i个士兵,就没有这个限制。)
tokitsukaze想知道,团的战力最大为多少。
输入描述:
第一行包含一个正整数n(1≤n≤10^5)。
接下来n行,每行包括2个正整数v,s(1≤v≤10^9,1≤s≤n)。
输出描述:
输出一个正整数,表示团的最大战力。
示例1
输入
2
1 2
2 2
输出
3
示例2
输入
3
1 3
2 3
100 1
输出
100
#include
#include
#include
using namespace std;
struct node
{
int v, s;
}a[100008];
bool comp(node a,node b)
{
return a.s > b.s;
}
int main()
{
multiset S;
int n;
long long ans = 0, sum = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i].v >>a[i].s;
}
sort(a, a + n, comp);
for (int i = 0; i < n; i++)
{
S.insert(a[i].v);
sum += a[i].v;
while (S.size() > a[i].s)
{
sum -= *S.begin();
S.erase(S.begin());
}
ans = max(ans, sum);
}
cout << ans;
return 0;
}
#include
#include
#include
using namespace std;
struct node
{
int x, y;
}a[100008];
bool comp(node u, node v)
{
return u.y > v.y;
}
int main()
{
priority_queue,greater > S;
int n;
long long ans = 0, sum = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i].x >> a[i].y;
}
sort(a, a + n, comp);
for (int i = 0; i < n; i++)
{
S.push(a[i].x);
sum += a[i].x;
while (S.size() > a[i].y)
{
sum -= S.top();
S.pop();
}
ans = max(ans, sum);
}
cout << ans;
return 0;
}
#include
#include
#include
using namespace std;
struct node
{
int x, y;
bool operator<(const node &v)const
{
return x>v.x;
}
}a[100008];
bool comp(node u, node v)
{
return u.y > v.y;
}
int main()
{
priority_queue S;
int n;
long long ans = 0, sum = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i].x >> a[i].y;
}
sort(a, a + n, comp);
for (int i = 0; i < n; i++)
{
S.push(a[i]);
sum += a[i].x;
while (S.size() > a[i].y)
{
sum -= S.top().x;
S.pop();
}
ans = max(ans, sum);
}
cout << ans;
return 0;
}
#include
#include
#include
using namespace std;
struct node
{
int x, y;
}a[100008];
bool comp(node u, node v)
{
return u.y > v.y;
}
struct cmp1
{
bool operator()(const node& u, const node& v)const
{
return u.x > v.x;
}
};
int main()
{
priority_queue,cmp1> S;
int n;
long long ans = 0, sum = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i].x >> a[i].y;
}
sort(a, a + n, comp);
for (int i = 0; i < n; i++)
{
S.push(a[i]);
sum += a[i].x;
while (S.size() > a[i].y)
{
sum -= S.top().x;
S.pop();
}
ans = max(ans, sum);
}
cout << ans;
return 0;
}