牛牛与世界杯门票
链接: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.


dack
98 声望18 粉丝

一直在路上