当前位置: 首页 > 知识库问答 >
问题:

如何在k学生中最大限度地分发巧克力

邵阳辉
2023-03-14

我在一次采访中被问到这个问题-

如果n个盒子中有一些巧克力排成一行,则在k名学生中平均分配的巧克力最大数量
。有k个学生。问题是通过从给定批次中选择一系列连续的盒子,在k个学生中平均分配最大数量的巧克力。假设这些框按从左到右从1到n的数字排成一行。我们必须选择一组连续排列的盒子,以便为所有k学生提供最多数量的巧克力。给出了一个数组arr[],表示盒子的行排列,arr[i]表示盒子中位置i处的巧克力数量。

示例:

输入:arr[]={2,7,6,1,4,5},k=3
输出:6
子阵列为{7,6,1,4},和18<18块巧克力在3名学生中的平均分配是6块<请注意,所选框按索引{1、2、3、4}的连续顺序排列。

我在GeekForgeks中找到了解决方案--

static int maxNumOfChocolates(int arr[], int n, int k) 
{ 
    // Hash table 
    HashMap <Integer,Integer> um = new HashMap<Integer,Integer>(); 

    // 'sum[]' to store cumulative sum, where 
    // sum[i] = sum(arr[0]+..arr[i]) 
    int[] sum=new int[n]; 
    int curr_rem; 

    // To store sum of sub-array having maximum sum 
    int maxSum = 0; 

    // Building up 'sum[]' 
    sum[0] = arr[0]; 
    for (int i = 1; i < n; i++) 
        sum[i] = sum[i - 1] + arr[i]; 

    // Traversing 'sum[]' 
    for (int i = 0; i < n; i++) { 

        // Finding current remainder 
        curr_rem = sum[i] % k; 

        // If true then sum(0..i) is divisible 
        // by k 
        if (curr_rem == 0) { 
            // update 'maxSum' 
            if (maxSum < sum[i]) 
                maxSum = sum[i]; 
        } 

        // If value 'curr_rem' not present in 'um' 
        // then store it in 'um' with index of its 
        // first occurrence 
        else if (!um.containsKey(curr_rem) ) 
            um.put(curr_rem , i); 

        else
            // If true, then update 'max' 
            if (maxSum < (sum[i] - sum[um.get(curr_rem)])) 
            maxSum = sum[i] - sum[um.get(curr_rem)]; 
    } 

    // Required maximum number of chocolates to be 
    // distributed equally among 'k' students 
    return (maxSum / k); 
} 

这行得通,但我需要一些解释为什么行得通,我能理解这个部分--

 if (curr_rem == 0) { 
           // update 'maxSum' 
           if (maxSum < sum[i]) 
               maxSum = sum[i]; 
       } 

如果数组元素的连续和可被k整除,则会起作用,但请尝试理解这一部分--

else if (!um.containsKey(curr_rem) ) 
        um.put(curr_rem , i); 

    else
        // If true, then update 'max' 
        if (maxSum < (sum[i] - sum[um.get(curr_rem)])) 
        maxSum = sum[i] - sum[um.get(curr_rem)];

这里的任何解释都会很有帮助

共有2个答案

越嘉石
2023-03-14
class Solve
{
//arr -> chocolates values, n = len(arr), k->no of students
//Idea:
//1.to use prefix sum and find the subarray whose sum is divisible by k.
//2.when we find the subarray we try to find the sum of this subarray by using 
//precomputation sum of arr
//3.we keep a max variable to record the max sum and return max that's it!!!!!
    static int maxNumOfChocolates(int arr[], int n, int k) 
    { 
        if(n==0)return 0;
        int []prefix = new int[n];
        prefix[0] = arr[0];
        for(int i=1;i<n;++i){
            prefix[i] = prefix[i-1]+arr[i];
        }
        HashMap<Integer,Integer> map = new HashMap<>();
        map.put(0,-1);
        int ans = -1;
        int sum = 0;
        for(int i=0;i<n;i++){
            sum+=arr[i];
            if(map.containsKey(sum%k)){
                int j = map.get(sum%k);
                ans = Math.max(ans,prefix[i]-((j>=0)?prefix[j]:0));
            }
            map.putIfAbsent(sum%k,i);
        }
        if(ans==-1)return -1;
        return ans/k;
    } 

}
蒙弘图
2023-03-14

非常简短的解释:

在主循环中,查看从索引0到当前索引的所有和。如果有余数,则必须检查是否可以从0以外的其他索引开始“使其消失”。

检查这与查找之前存储的相等余数完全相同。

例如,您在索引7处有余数3。如果您在索引13处再次有余数3,则在7和13之间相加就没有余数。剩下的是取最大值。找到的所有解决方案的总和。

 类似资料:
  • 我已经在树莓派7英寸上安装了tarantool,并希望尽量减少与硬盘(sd卡)的交互。有什么简单的方法可以做到这一点。hdd的真正用法是什么?

  • 我正在处理一些发布论坛项目,并试图找出理想的FiRecovery数据库结构。我读到文档的最大大小为1 mg,但通过将多个帖子存储在文档中而不是为每个帖子使用单个文档来最大限度地利用每个文档的存储空间的利弊是什么? 我认为它会更便宜。假设应用程序将使用文档中的所有数据,带宽成本是相同的,但不是多次读取,我将只对一个文档收费。这有意义吗? 它也会更快吗?

  • 在大学生毕业就业时,面试是一个非常重要的过程,有些大学生在这个过程中感到不知所措,或者做得不好,使自己在求职中因小失大,达不到成功。在求职过程中注意了以下基本礼仪和技巧,才能达到事半功倍,增强面试的有效性。以下是出国留学网小编为大家整理的大学生面试技巧介绍,欢迎大家阅读,更多精彩内容请关注出国留学网. 1、面试中的基本礼仪 (1)一旦和用人单位约好面试时间后,一定要提前5-10分钟到达面试地点,以

  • 我正在使用CUDA上运行的Marching Cubes算法从体积数据生成网格。 我尝试过保存网格并以3种方式渲染它。 将一组粗略的三角形保存为顶点数据的连续数组。我估计第一次通过时的大小,创建一个OpenGL VBO,将其映射到CUDA,并以下面的格式将顶点数据写入其中 并使用绘制它。 VBO中的冗余顶点,每个立方体的冗余顶点,无索引。 VBO中没有冗余顶点,生成索引。 VBO中的冗余顶点,每个立

  • 问题内容: 我正在使用PostgreSQL,并且在表中有一列,其中包含非常长的文本。我想在查询中选择此列,但限制其显示长度。 就像是: 我该怎么做? 问题答案: 您可以做的是使用PostgreSQL的substring()方法。以下两个命令之一将起作用:

  • 主要内容:大学生的求职面试技巧1,大学生的求职面试技巧2,大学生的求职面试技巧3,大学生的求职面试技巧4,大学生的求职面试技巧5,大学生的求职面试技巧6,大学生的求职面试技巧7,大学生的求职面试技巧8大学生的求职面试技巧 大学生的求职面试技巧1   大学生求职面试礼仪的技巧   求职面试前的礼仪:   1.头发干净自然,如要染发则注意颜色和发型不可太标新立异。   2.服饰大方整齐合身。男女皆以时尚大方的套服为宜。   3.面试前一天修剪指甲,忌涂指甲油。   4.不要佩戴标新立异的装饰物。