原题
题源:美团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
),然后把做好的先给买家看。
如果其中有蛋糕就偏重或者偏轻的,这笔买卖就泡汤。
如果做好了的蛋糕都没超重或超轻,里面又刚好有买家需要的重量为 a
和 b
的,就刚好给买家拿去。
如果做好的蛋糕里没有超标的,就从仓库(未做的蛋糕)里找。只要仓库里可以补上另外缺少的就行。缺一个补一个,缺两个补两个。补不上,买卖也泡汤。
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不容易呀