房间收纳
Description
对于零落的玩具,你需要进行收纳,为了将最多的玩具进行收纳,请你合理分配收纳柜和房间数量。
请你将一些玩具收纳在一个房间中,给你一个二维数组 roomTypes,其中的roomTypes[i] = {numberOfBoxes_i, numberOfUnitPerRoom_i}
- numberOfBoxes_i 是类型 i 的收纳柜的数量;
- numberOfUnitPerRoom_i 是类型 i 的收纳柜可以收纳的玩具数量;
整数roomSize表示房间中可以放下的收纳柜的最大数量。只要箱子数量不超过 roomSize,你就可以选择任意收纳柜放到房间中。
返回房间可以收纳的玩具最大总数。
提示:
(1)1 ≤ roomTypes.length ≤ 1000
(2)1 ≤ numberOfBoxes_i, numberOfUnitPerRoom_i ≤ 1000
(3)1 ≤ roomSize ≤ 10^6
Input
第 1 行输入收纳柜种类数目 n;
第 2 到第 n+1 行输入第 i 个收纳柜的数量及当前收纳柜可以收纳的玩具数量(即二维数组 roomTypes),每行两个数之间用空格隔开;
第 n+2 行输入房间可以放下的收纳柜总数量;
如:
3
1 3
2 2
6 1
4
Output
输出最大收纳的玩具数量(整数),如:
7
Sample
代码
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int roomN[] = new int[n];
int roomC[] = new int[n];
for(int i = 0;i<n;i++){
roomN[i] = scanner.nextInt();
roomC[i] = scanner.nextInt();
}
int capacity = scanner.nextInt();
//排序
for(int i = 0;i<n-1;i++)
for(int j = i+1;j<n;j++){
if(roomC[i]<roomC[j]){
int tempN = roomN[i];
roomN[i] = roomN[j];
roomN[j] = tempN;
int tempC = roomC[i];
roomC[i] = roomC[j];
roomC[j] = tempC;
}
}
//收纳的玩具数量
int count = 0;
//开始计数的序号
int number=0;
//容量
int c = 0;
while(c<capacity&&number<n){
if(roomN[number]>0){
count+=roomC[number];
c++;
roomN[number]--;
}
else {
number++;
}
}
System.out.println(count);
}
}
思路
贪心法解决,首先排序,排序的时候两个数组同时交换
其次不断添加roomC即可