牛牛与世界杯门票
链接:https://www.nowcoder.com/ques...
来源:牛客网
今年的世界杯要开始啦,牛牛作为一个球迷,当然不会放过去开幕式现场的机会。但是牛牛一个人去又觉得太过寂寞,便想叫上了他的n个小伙伴陪他一起去莫斯科(一共n+1人)。当牛牛开始订开幕式的门票时,发现门票有m种套餐,每种套餐需要花费x元,包含y张门票,每张门票也可以单独购买,此时这张门票的价格为k元。请问牛牛要怎样选择购买门票,使得他花费的钱最少。(每种套餐可以购买次数没有限制)。
输入描述:
第一行输入三个数字n(0≤n≤999)、m(1≤m≤1000)和k(1≤k≤100000)
接下来m行,每行输入两个数字xi(1≤xi≤100000)和yi(2≤yi≤1000), 表示套餐的价格和套餐内包含的门票数量。
输出描述:
输出牛牛至少要花费的钱的数量。
思路:使用数组ticket[i]来保存有i人时的最小花费,
首先将数组ticket数组的值保存为不同套餐每个人单买票的花费(初始最低费用)。
然后整理套餐的费用,分为:
1、 小于等于当前套餐票数时,比较之前的最低费用(整理过)和当前套餐的费用高低。
2、 大于等于当前套餐票数时,比较之前的最低费用(整理过)和加上这个套餐的费用高低Math.min(ticket[i],ticket[i-y]+x)。y为套餐人数,x为套餐费用
代码如下:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int k = sc.nextInt();
int[] ticket = new int[n+2];
for(int i = 1;i<=n+1;i++){
ticket[i] = i * k;
}
int x,y;
while(m-- > 0){
x = sc.nextInt();
y = sc.nextInt();
for(int i = 1;i<=n+1;i++){
if(i - y >= 0){
ticket[i] = Math.min(ticket[i],ticket[i-y] + x);
}else{
ticket[i] = Math.min(ticket[i],x);
}
}
}
System.out.println(ticket[n+1]);
}
}
贪心算法:保证每次操作都是局部最优,并且最后得到的结果是全局最优的。
1、分配饼干
455.Assign Cookies (Easy)
Input: [1,2], [1,2,3]
Output: 2
Explanation: You have 2 children and 3 cookies. The greed factors of 2 children are 1, 2.
You have 3 cookies and their sizes are big enough to gratify all of the children,
You need to output 2.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。