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