【问题标题】:Calculating optimal division for each element in array计算数组中每个元素的最佳除法
【发布时间】:2015-07-29 00:40:49
【问题描述】:

假设我有一个正整数数组,每个代表一根杆的长度,例如:

[26, 103, 59]

我想找到一些正整数大小,我会将这些棒中的每一个切割成它。我将受到我削减的总数和剩余部分的总和的惩罚。


示例

例如,如果我将长度如上的杆切割成长度为 6 的片段,我将得到:

  • 杆一(长 26):4 件 + 余数 2

  • 杆二(长 103):17 根 + 剩余 1 根

  • 杆三(长 59):9 根 + 剩余 5 根

处罚是

  • 4 + 17 + 9 = 30 次切割

  • 2 + 1 + 5 = 8 余数


我想要一个算法作为输入:

  • 杆长度数组

  • 削减惩罚成本

  • 剩余罚金

并输出最佳切割尺寸。

【问题讨论】:

  • 那么你的代码是什么?你在哪里卡住了?
  • hackerrank.com/contests/juniper-hackathon/challenges/metals 这就是问题所在。我一直在寻找杆的最佳长度
  • 你对你的算法有什么初步的想法吗?
  • 第一种情况我尝试从数组中取出最小值,并将其用作最佳长度。如果数字非常小而其他数字非常大,则此算法将失败。在这种情况下,总削减成本会高得多。而在其他情况下,如果我考虑取数组总和的平均值,那又是一个非常糟糕的解决方案。
  • 约束中的所有数字都足够小,因此您可以暴力破解解决方案......

标签: arrays algorithm divide-and-conquer


【解决方案1】:

这是一个蛮力解决方案,请尝试一下。

import java.io.*;
import java.util.*;

public class Solution {

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner s=new Scanner(System.in);
        long c=s.nextLong();
        long pr=s.nextLong();
        long l=s.nextLong();
        long[] array=new long[(int)l];
        long max=0;
        for(int x=0;x<l;x++){
             array[x]=s.nextLong();
             if(max<array[x])
                  max=array[x];
        }
        long ans=0;
        for(int p=1;p<=max;p++){
            long sum=0;
            long cut=0;
            for(int q=0;q<l;q++){
                sum+=(array[q]/p);
                if(array[q]%p==0){
                cut+=(array[q]/p)-1;
                }else{
                    cut+=(array[q]/p);
                }

            }
            long cost=sum*p*pr-cut*c;
            if(cost>ans)
                 ans=cost;

        }
        System.out.println(ans);   

    }
}

【讨论】:

  • for(int p=1;p&lt;max;p++){ : 如果max 给出最优化的答案怎么办?应该是p&lt;=max。计算利润的 sn-p 也是错误的,因为有时 num_of_cut 不等于 num_of_rod。例如,我们只需要 1 切割一根 4 杆即可拥有 2 2 杆。
  • 是的,那是错误的,但现在我已经编辑了,请检查一下,如果我错了,请告诉我,感谢指出错误
  • 考虑添加一个段落来解释代码背后的想法。
  • @nikhiljain:现在好多了。您可以使用cut += (array[q] - 1) / p; 代替if 语句。两者的结果相同。
  • @Sandesh 你能在hackerrank.com上提交代码并告诉我分数是多少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2021-05-14
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多