六一儿童节----贪心思想

题目描述

六一儿童节,老师带了很多好吃的巧克力到幼儿园。每块巧克力j的重量为w[j],对于每个
小朋友i,当他分到的巧克力大小达到h[i] (即w[j]>=h[i]),他才会上去表演节目。老师
的目标是将巧克力分发给孩子们,使得最多的小孩上台表演。可以保证每个w[i]> 0且不能
将多块巧克力分给一个孩子或将一块分给多个孩子。
输入描述:
第一行:n,表示h数组元素个数
第二行:n个h数组元素
第三行:m,表示w数组元素个数
第四行:m个w数组元素
输出描述:
上台表演学生人数
示例1
输入
3
2 2 3
2
3 1
输出
1

题目分析

首先由题目的意思可以理解为,有m块特定重量的巧克力,
分给h个人,如果那个人得到的巧克力重量大于期望的,就会去上台表演。
那么怎么分配这些巧克力使上台的人数最大。


思路分析

由贪心算法的思想,尽可能的使得每让一个人上台,花费最小重量
巧克力,这样剩下的巧克力就能够分给更多的人。

那么怎么实现呢?将巧克力的重量数组,按照从小到大排序,依次选出最小重量的
巧克力,换句话说,每次都只使用最小重量的巧克力,那么剩下的一定是最多的,遍历h数组,看看是否可以使得孩子上台,如果可以计数器加1。

import java.util.Arrays;
import java.util.Scanner;
public class ChildernDay  {
   public static void main(String args[])  {
      Scanner scn = new Scanner(System.in);
      // 计数器,上台的人数
      int num=0;
      // 输入小孩的人数h
      int h = scn.nextInt();
      int[] child = new int[h];
      // 循环输入期望分到的巧克力重量
      for(int i=0;i<h;i++)  {
         child[i] = scn.nextInt();  
      }
      
      // 输入巧克力的个数
      int m = scn.nextInt();
      int[] weight = new int[m];
      for(int i=0;i<m;i++)  {
         weight[i]=scn.nextInt();
      }
      
      // 使用选择排序方法-----可以使用java中的Arrays.sort
//      for(int i=0;i<m;i++)  {
//         int value = i;
//         for(int j=i+1;j<m;j++)  {
//             if(weight[j]<weight[value])   {
//                value = j;
//             }
//         }
//         if(value != i)  {
//             int temp = weight[i];
//             weight[i] = weight[value];
//             weight[value] = temp;
//         }
//      }
      
      // 可以使用快速排序,提升排序的速度
      Arrays.sort(weight);
      
      
      
      // 依次选出巧克力数组中重量最小的巧克力
      for(int i=0;i<m;i++)  {
// 遍历孩子数组
for(int j=0;j<h;j++) {
// 这里注意,当孩子已经上台,就跳过。
if(child[j]==-1) continue; if(weight[i]>=child[j]) { num++; child[j] = -1; break; } } } System.out.println(num); } }

猜你喜欢

转载自www.cnblogs.com/lixiaochi/p/10702460.html