• 公路建厂最短路径问题



    The question:
      12个工厂分布在一条东西向高速公路的两侧,工厂距离公路最西端的距离分别是0、4、5、10、12、18、27、30、31、38、39、47.
      在这12个工厂中选取3个原料供应厂,使得剩余工厂到最近的原料供应厂距离之和最短,问应该选哪三个厂 ?


    The code:
     1 import java.util.Scanner;
     2 
     3 public class Main {
     4     
     5     
     6     public static void main(String[] argv){        
     7         Scanner in = new Scanner(System.in);
     8         // 存放结果....
     9         int min_start=0;
    10         int min_end=0;
    11         int min_RESULT=0;
    12         
    13         //输入.....
    14         int M =in.nextInt();
    15         int[] s = new int[M];
    16         for(int i=0; i<M; i++){
    17             s[i]=in.nextInt();
    18         }
    19         in.close();
    20         
    21         //处理....
    22         int[][] F_length = new int [M][2];      //如果选单个 第i个点建厂  F_length[i][0]即左边到厂的距离和      F_length[i][1]即右边到厂的距离和 
    23         for(int j=0; j<M; j++){
    24             int sum_0=0;
    25             int sum_1=0;
    26             if(j==0){            
    27                 for(int k=0; k<M; k++){
    28                     if(j>=k)
    29                         sum_0=sum_0+s[j]-s[k];
    30                     else
    31                         sum_1=sum_1+s[k]-s[j];            
    32                 }                    
    33             }
    34             else{
    35                 sum_0=F_length[j-1][0]+j*(s[j]-s[j-1]);
    36                 sum_1=F_length[j-1][1]-(M-j)*(s[j]-s[j-1]);                
    37             }
    38             
    39             F_length[j][0]=sum_0;
    40             F_length[j][1]=sum_1;
    41             //System.out.println(" "+j+":  "+sum_0+"     "+sum_1);
    42         }
    43         //获取建两个厂的结果
    44         int[][] result = new int[M][M];          //如果选两个 第i,k个点建厂  result[i][k]即所有点到最近厂的距离和  
    45         for(int i=0; i<M;i++){
    46             
    47             for(int j=i+1; j<M; j++){
    48                 result[i][j]=F_length[i][0]+F_length[j][1];
    49                 for(int t=i+1;t<j;t++){
    50                     int x= s[t]-s[i];
    51                     int y= s[j]-s[t];
    52                     if(x>y)
    53                         x=y;
    54                     result[i][j]=result[i][j]+x;                    
    55                 }
    56                 if(min_RESULT==0||min_RESULT>result[i][j]){
    57                     min_start=i;
    58                     min_end=j;
    59                     min_RESULT=result[i][j];    
    60                 }
    61                 /*
    62                 else{
    63                     if(min_RESULT>result[i][j]){
    64                         min_start=i;
    65                         min_end=j;
    66                         min_RESULT=result[i][j];
    67                     }
    68                         
    69                 }*/
    70                                     
    71                 System.out.println(" "+i+" "+j+" "+result[i][j]);
    72             }    
    73             
    74         }
    75         
    76         System.out.println("The first is "+min_start+".");
    77         System.out.println("The second is "+min_end+".");
    78         System.out.println("The length is "+min_RESULT+".");
    79     
    80    }
    81 }
    
    

    测试用例:

    /*
    12
    0
    4
    5
    10
    12
    18
    27
    30
    31
    38
    39
    47
    */

    Result: 

    The first is 2.
    The second is 8.
    The length is 67.

     
     
  • 相关阅读:
    AppiumDesktop控制手机和安卓模拟器
    Appium环境搭建超详细教程
    2022 杭电多校第一场
    Springcloud学习笔记48ApplicationRunner、CommandLineRunner接口使用
    java中23种设计模式

    Nacos
    Java常见的8种数据结构
    Java 对象模型(OOPKlass模型)
    nginx对skywalking grpc协议的负载nginx长连接和短连接概念
  • 原文地址:https://www.cnblogs.com/udld/p/4724932.html
Copyright © 2020-2023  润新知