目录
牛客_chika和蜜柑_TopK
题目解析
C++代码
Java代码
牛客_chika和蜜柑_TopK
chika和蜜柑 (nowcoder.com)
描述:
chika很喜欢吃蜜柑。每个蜜柑有一定的酸度和甜度,chika喜欢吃甜的,但不喜欢吃酸的。
一共有n个蜜柑,chika吃k个蜜柑,将获得所吃的甜度之和与酸度之和。chika想获得尽可能大的甜度总和。如果有多种方案,她希望总酸度尽可能小。
她想知道,最终的总酸度和总甜度是多少?
题目解析
将每个橘子按照甜度由高到低排序,相同甜度的橘子按照酸度由低到高排序。然后提取排序后的前 k 个橘子就可以了。
C++代码
#include <iostream>
#include <ostream>
#include <queue>
#include <utility>
#include <vector>
using namespace std;
struct cmp
{
bool operator()(pair<int, int> p1, pair<int, int> p2) // 堆的比较和逻辑相反
{
if (p1.first > p2.first)
return false;
else if (p1.first == p2.first)
return p1.second > p2.second;
else
return true;
}
};
#define int long long
signed main()
{
int n = 0, k = 0;
cin >> n >> k;
// vector<int> a(n), b(n);
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> qb;
vector<int> a(n);
for (int i = 0; i < n; ++i)
{
cin >> a[i];
}
int x = 0;
for (int i = 0; i < n; ++i)
{
cin >> x;
qb.push({ x, a[i] });
}
// while(qb.size())
// {
// cout << qb.top().first << " " << qb.top().second << endl;
// qb.pop();
// }
// cout << "-------------" << endl;
int sum1 = 0, sum2 = 0;
while (qb.size() && k--)
{
sum2 += qb.top().first;
sum1 += qb.top().second;
qb.pop();
}
cout << sum1 << " " << sum2 << endl;
return 0;
}
Java代码
import java.util.*;
class Orange
{
int a; // 酸度
int b; // 甜度
Orange(){}
Orange(int a, int b)
{
this.a = a;
this.b = b;
}
}
public class Main
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
int n = in.nextInt(), k = in.nextInt();
Orange[] o = new Orange[n];
for(int i = 0; i < n; i++)
{
o[i] = new Orange();
o[i].a = in.nextInt();
}
for(int i = 0; i < n; i++)
{
o[i].b = in.nextInt();
}
// 排序
Arrays.sort(o, (x, y) -> {
if(x.b == y.b)
return x.a - y.a;
return y.b - x.b;
});
// 提取结果
long x = 0, y = 0;
for(int i = 0; i < k; i++)
{
x += o[i].a;
y += o[i].b;
}
System.out.println(x + " " + y);
}
}