算法题 | 糕点

254 阅读3分钟

原题

题源:美团2021校招笔试-编程题(通用编程试题,第9场)

题目描述

链接:www.nowcoder.com/questionTer… 来源:牛客网

输入描述:

输入包含多组数据,每组数据两行。每组数据的第一行包含4个整数,n,m,a,b,空格隔开。这里不保证a和b的大小关系。接下来一行m个数,空格隔开,代表烤好的蛋糕重量

输出描述:

对于每一组数据,如果可以办到顾客的要求,输出YES,否则输出NO

示例1

输入

4 2 2 4
3 3
4 2 2 4
1 1
4 2 2 4
5 5
4 2 4 2
2 4
2 2 2 4
3 3
3 2 2 4
3 3
3 2 2 4
3 3

输出

YES
NO
NO
YES
NO
NO
NO

备注:

对于40%的数据,m≤10

对于100%的数据,1≤n,m,a,b≤1000,m≤n, 蛋糕重量不会超过1000

题意描述

讲的是一个买家和卖家的故事,卖家是做蛋糕的,有一天,买家过来报 2 个数字,要求你今天做的蛋糕最重和最轻刚好为我叫的这两个数字,如果今天做的蛋糕里有重了的或者轻了的都不行。

如果烤好了的蛋糕里没有这 2 个数没关系,从未烤的蛋糕里补上就行,别说我太严格了好吧。

烘焙师哪敢怠慢,看见买家来,就报上今天准备总共做几个(n),已经做了几个(m),然后把做好的先给买家看。

如果其中有蛋糕就偏重或者偏轻的,这笔买卖就泡汤。

如果做好了的蛋糕都没超重或超轻,里面又刚好有买家需要的重量为 ab 的,就刚好给买家拿去。

如果做好的蛋糕里没有超标的,就从仓库(未做的蛋糕)里找。只要仓库里可以补上另外缺少的就行。缺一个补一个,缺两个补两个。补不上,买卖也泡汤。

n 是面包师当天要烤的总数量;m 是已经烤好的数量; a 和 b 是买家报的最大重量和最小重量(不一定哪个为最大值,需要判断) 输入的两行数据里, 第一行依次为 n, m, a, b 第二行为已烤的蛋糕重量,为 m 个,新建一个长度为 m 的数组接收。

仓库里的蛋糕个数为 n-m

需要留意的一个地方

​ m ≤10,就是说可能蛋糕师一个都没有烤。这时候就要从仓库里找 2 个。

​ 如果没有超标的,只要仓库的数量大于等于缺少的蛋糕,就一定可以做出来!

程序

import java.util.*;
public class CakeTest {
	public static void main(String[] args) {
        Scanner sn = new Scanner(System.in);        
        List<String> list = new ArrayList<>();
        while (sn.hasNext()) {        	
            int n = sn.nextInt();
            int m = sn.nextInt();
            int a = sn.nextInt();
            int b = sn.nextInt();
            //对 a 和 b 作一个大小判断,min 为最小的,max 为最大的
            int min = a<b? a:b;
            int max = a>b? a:b;   
            //列出第二行已经做好了的 m 个面包
            int[] done = new int[m];
            
            boolean hasMin = false;
            boolean hasMax = false;
            //如果一个都没烤,从仓库里找能不能补上的
            if (m <= 0) {              	
                if (n >= 2) {
                    System.out.println("YES");                    
                }
                else 
                    System.out.println("NO");                    
            }
            //若一个都没烤的,从仓库里找蛋糕数量有没有大于等于 2 ,补上2个蛋糕
            else {
                   for (int i = 0; i < m; i++) {
                        int x = sn.nextInt();
                        done[i] = x;                     
                    } 
                   //否则,继续接收键盘输入的值,依次赋值给已已烤的面包
	                Arrays.sort(done);
	                //将已烤的面包升序,方便判断面包是否超重或者超轻
	                if (done[0] < min || done[done.length-1] > max) {
	                	System.out.println("NO");                	
	                }     
	                //比较第一个和最后一个有不合格则不达标:假设已烤的面包有 1 个以上
	                else {
	                	//(此时默认达标)如果没有重量越界的蛋糕,遍历所有蛋糕
	                	for (int i = 0; i < m; i++) {                                
	                        if (done[i] == min) {
	                            hasMin = true;
	                        }
	                        //如果其中有重量刚好为 min 的,记录
	                        if (done[i] == max) {
	                            hasMax = true;	                            
	                        }                
	                        //如果有刚好为 max 的,记录
	                    }                                      
	                    if (hasMin==true && hasMax==true) {                        
	                        System.out.println("YES");                
	                    }
	                    //如果都有就YES
	                    //(此时默认达标)否则继续从仓库里找,假设已烤的蛋糕中只有1个达标
	                    else if (hasMin==true || hasMax==true) {
	                        int delta = n - m;
	                        if (delta >= 1) {                            
	                            System.out.println("YES");                    
	                        }       
	                        //只有1个满足时,检查仓库里是否有 1 个或 1 个以上可以补上
	                        else {                            
	                            System.out.println("NO");                    
	                        }                        	                        
	                    }    
	                    //(此时默认达标)假设已烤的蛋糕里没有达标的,检查仓库有没有 2 个或 2 个以上
	                    else if (hasMin==false && hasMax==false) {
	                        int delta = n - m;
	                        if (delta >= 2) {                            
	                            System.out.println("YES");                    
	                        }                        
	                        else {                            
	                            System.out.println("NO");                    
	                        }                        
	                    }//end else if
                }//end else
                 
            }                   	                    	
        }//end while        
    }//end main
}//end class

小结

1.了解整个 game 规则后,不难解

2.要生活,赚份蛋糕钱真tm不容易呀