餐馆就餐问题

问题来源:

2017滴滴出行面试题

问题描述:

链接:https://www.nowcoder.com/questionTerminal/d2cced737eb54a3aa550f53bb3cc19d0?orderByHotValue=0&commentTags=Java
来源:牛客网
某餐馆有n张桌子,每张桌子有一个参数:a 可容纳的最大人数; 有m批客人,每批客人有两个参数:b人数,c预计消费金额。 在不允许拼桌的情况下,请实现一个算法选择其中一部分客人,使得总预计消费金额最大 

输入描述:

输入包括m+2行。 第一行两个整数n(1 <= n <= 50000),m(1 <= m <= 50000) 第二行为n个参数a,即每个桌子可容纳的最大人数,以空格分隔,范围均在32位int范围内。 接下来m行,每行两个参数b,c。分别表示第i批客人的人数和预计消费金额,以空格分隔,范围均在32位int范围内。

输出描述:

输出一个整数,表示最大的总预计消费金额

示例1

输入
3 5 2 4 2 1 3 3 5 3 7 5 9 1 10
输出

20


解题思路:

消费金额由高到低,人数由少到多检索顾客;

容量由小到大检索桌子;

检测到于顾客人数相等的桌子,总金额加上该顾客群体的消费金额;并从桌子序列里删去该桌子;


代码实现

package ali.test;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;


public class Main{
	public static void main(String[] args) {
		@SuppressWarnings("resource")
		Scanner scan = new Scanner(System.in);
		int lenDesk = scan.nextInt();
		List<Integer> desk = new ArrayList<>(lenDesk);
//		desk.add(2);desk.add(4);desk.add(2);		
//		int[][] customer = {{1,3},{3,5},{3,7},{5,9},{1,10}};
		int lenCustomer = scan.nextInt();
		int[][] customer = new int[lenCustomer][];
		
		//读入桌子数据并降序排列(降序:从后往前检索桌子时,删除桌子时不会打乱前面桌子的索引)
		for (int i = 0; i < lenDesk; i++) {
			desk.add(scan.nextInt());
		}
		Collections.sort(desk,Collections.reverseOrder());
		
		//读入顾客
		for (int i = 0; i < lenCustomer; i++) {
			
			customer[i] = new int[] {scan.nextInt(),scan.nextInt()};
		}
		//按照消费金额由高到低,人数由少到多对顾客进行排序
		//排位越靠后,优先级越高
		Arrays.sort(customer,new Comparator<int[]>() {
			@Override
			public int compare(int[] o1, int[] o2) {
				if(o1[1] > o2[1])
					return 1;
				else
					if(o1[1] < o2[1])
						return -1;
					else
						if(o1[0] < o2[0])
							return 1;
						else
							if(o1[0] > o2[0])
								return -1;
							else
								return 0;
			}
		});
		int sum = 0;
		for (int i = customer.length-1; i >= 0; i--) {
			for (int j = desk.size()-1; j >= 0; j--) {
				if(desk.get(j) >= customer[i][0]) {
					sum += customer[i][1];
					desk.remove(j);
					break;
				}
			}
		}
		System.out.println(sum);		
	}
}
显示运行效果:

您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为50.00%

测试用例:
21634 18538

对应输出应该为:

92696455276

你的输出为:

-1792825236

从我的代码里不可能出现只输入2个数据的输入情况。

所以这个是什么意思???显示错误???

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值