每日OJ题_牛客_chika和蜜柑_TopK_C++_Java

发布于:2024-10-15 ⋅ 阅读:(202) ⋅ 点赞:(0)

目录

牛客_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);
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到