day11 第十二届蓝桥杯国赛 JavaB

day11(每日一题)

🎉前言:每日更新!不断更!,周内一天一题.周末算法精析

✨更新地址:Royeblog

🎆🎆第十二届国赛javaB 试题H: 巧克力

🎉题目链接:题号1596

简单描述题目:

【问题描述】

小蓝很喜欢吃巧克力,他每天都要吃一块巧克力。
  一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力,每种巧克力有自己的价格、数量和剩余的保质期天数,小蓝只吃没过保质期的巧克力,
  请问小蓝最少花多少钱能买到让自己吃x天的巧克力。

【输入格式】
输入的第一行包含两个整数x,n,分别表示需要吃巧克力的天数和巧克力的种类数。接下来n行描述货架上的巧克力,其中第i行包含三个整数ai,bi,ci表示第i种巧克力的单价,保质期,数量
【输出格式】
输出一个整数表示小蓝的最小花费。
如果不存在让小蓝吃x天的购买方案,输出-1。
【样例输入】

10 3
1 6 5
2 7 3
3 10 10

【样例输出】

18

【样例说明】
一种最佳的方案是第1种买5块,第2种买2块,第3种买3块。
前5天吃第1种,第6、7天吃第2种,第8至10天吃第3种。


import java.util.ArrayList;
import java.util.Scanner;

public class H巧克力 {
    static class qiaokeli {
        int price;
        int data;
        int num;

        public qiaokeli(int price, int data, int num) {
            this.price = price;
            this.data = data;
            this.num = num;
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int day = sc.nextInt();
        int n = sc.nextInt();
        ArrayList<qiaokeli> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            list.add(new qiaokeli(sc.nextInt(), sc.nextInt(), sc.nextInt()));
        }
        list.sort((o1, o2) -> {
            if (o1.price == o2.price) {
                if (o2.data == o1.data) {
                    return o1.num - o2.num;
                }
                return o1.data - o2.data;
            }
            return o1.price - o2.price;
        });

        long ans = 0;
        boolean flag = false;
        while (day > 0) {
            int i = 0;
            while (i < n) {
                int data = list.get(i).data;
                int price = list.get(i).price;
                int num = list.get(i).num;
                if (data >= day && num > 0) {
                    ans += price;
                    list.set(i, new qiaokeli(price, data, --num));
                    break;
                }
                i++;
            }
            if (i == n) {
                flag = true;
                break;
            }
            day--;
        }
        if (flag) {
            System.out.println(-1);
        } else {
            System.out.println(ans);
        }
    }
}

这里我超时了一个样例,好像可以的用二分查找,我遍历肯定慢,但是这道题主要考的是贪心,稍微理解一下就知道应该是先排价格,再日期,再数量,然后从后往前应该是很好理解的,贪心每个题都不一样,这道题注意反这排是最优😎

❗❗总结:好好学习每一天
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值