计算数组

时间:2015-05-17 13:42:01

标签: arrays algorithm divide-and-conquer

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

[26, 103, 59]

我想找到一些正整数尺寸,我将切割每根这些杆。我将受到我所做的削减总数和剩余部分总和的惩罚。

示例

例如,如果我将长度如上所述的棒切成长度为6的碎片,我会得到:

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

  • 杆2(长度103):17件+余量1

  • 杆三(长度59):9件+余量5

处罚

  • 4 + 17 + 9 = 30次削减

  • 2 + 1 + 5 = 8余数

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

  • 一系列杆长

  • 削减罚款

  • 余额罚款

并输出最佳切割尺寸。

1 个答案:

答案 0 :(得分:0)

这是一个蛮力的解决方案,只需尝试一下。

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);   

    }
}