• Problem W UVA 662 二十三 Fast Food


    Fast Food
    Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu
    Appoint description: 

    Description

    Download as PDF
     

    The fastfood chain McBurger owns several restaurants along a highway. Recently, they have decided to build several depots along the highway, each one located at a restaurent and supplying several of the restaurants with the needed ingredients. Naturally, these depots should be placed so that the average distance between a restaurant and its assigned depot is minimized. You are to write a program that computes the optimal positions and assignments of the depots.


    To make this more precise, the management of McBurger has issued the following specification: You will be given the positions of nrestaurants along the highway as n integers $d_1 < d_2 < dots < d_n$ (these are the distances measured from the company's headquarter, which happens to be at the same highway). Furthermore, a number $k (k leŸ n)$ will be given, the number of depots to be built.

    The k depots will be built at the locations of k different restaurants. Each restaurant will be assigned to the closest depot, from which it will then receive its supplies. To minimize shipping costs, the total distance sum, defined as

    egin{displaymath}sum_{i=1}^n mid d_i - (mbox{position of depot serving restaurant }i) mid
end{displaymath}

    must be as small as possible.

    Write a program that computes the positions of the k depots, such that the total distance sum is minimized.

    Input 

    The input file contains several descriptions of fastfood chains. Each description starts with a line containing the two integers n and knand k will satisfy $1 leŸ n
leŸ 200$$1 leŸ k Ÿle 30$$k le n$. Following this will n lines containing one integer each, giving the positions di of the restaurants, ordered increasingly.

    The input file will end with a case starting with n = k = 0. This case should not be processed.

    Output 

    For each chain, first output the number of the chain. Then output an optimal placement of the depots as follows: for each depot output a line containing its position and the range of restaurants it serves. If there is more than one optimal solution, output any of them. After the depot descriptions output a line containing the total distance sum, as defined in the problem text.


    Output a blank line after each test case.

    Sample Input 

    6 3
    5
    6
    12
    19
    20
    27
    0 0
    

    Sample Output 

    Chain 1
    Depot 1 at restaurant 2 serves restaurants 1 to 3
    Depot 2 at restaurant 4 serves restaurants 4 to 5
    Depot 3 at restaurant 6 serves restaurant 6
    Total distance sum = 8
    

    Miguel Revilla
    2000-05-22
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 using namespace std;
     5 const int inf=0x3f3f3f3f;
     6 
     7 int a[205],face[35][205],dp[35][205],cost[205][205];
     8 
     9 int put(int k,int n)
    10 {
    11     if(k)
    12     {
    13         int up=face[k][n]+1,mid=(up+n)/2;
    14         put(k-1,face[k][n]);
    15         if(up==n)
    16             printf("Depot %d at restaurant %d serves restaurant %d
    ",k,mid,n);
    17         else
    18             printf("Depot %d at restaurant %d serves restaurants %d to %d
    ",k,mid,up,n);
    19     }
    20     return 0;
    21 }
    22 
    23 int main()
    24 {    
    25     int n,K,mid,cas=1;
    26     int i,j,k;
    27     while(scanf("%d %d",&n,&K)!=EOF)
    28     {
    29         memset(cost,0,sizeof(cost));
    30         if(n==0 && K==0)
    31             break;
    32         for(i=1;i<=n;i++)
    33         {
    34             scanf("%d",&a[i]);
    35         }
    36         for(i=1;i<=n;i++)
    37         {
    38             for(j=i;j<=n;j++)
    39             {
    40                 mid=(i+j)/2;
    41                 for(k=i;k<=j;k++)
    42                 {
    43                     cost[i][j]=cost[i][j]+abs(a[k]-a[mid]);
    44                 }
    45             }
    46         }
    47         for(i=1;i<=n;i++)
    48         {
    49             dp[1][i]=cost[1][i];
    50         }
    51 
    52         for(i=2;i<=K;i++)
    53         {
    54             for(j=i;j<=n;j++)
    55             {
    56                 dp[i][j]=inf;
    57                 for(k=i-1;k<j;k++)
    58                 {
    59                     if(dp[i][j]>(dp[i-1][k]+cost[k+1][j]))
    60                         dp[i][j]=dp[i-1][k]+cost[k+1][j],face[i][j]=k;
    61                 }
    62             }
    63         }
    64 
    65         printf("Chain %d
    ",cas++);
    66         put(K,n);
    67         printf("Total distance sum = %d
    
    ",dp[K][n]);
    68     }
    69     return 0;
    70 }
    View Code
  • 相关阅读:
    [原创]什么是安全性测试
    [原创]如何有效的考核测试人员
    [原创]MySql官方压力测试工具Mysqlslap
    [原创软件测试工作技能
    [原创]如何有效构建测试环境
    [原创]常见系统测试类型总结
    [原创]Kjava手机顽童模拟器
    [原创]浅谈测试人员提交缺陷记录
    [原创]Windows/Unix 资源性能计数器
    [原创]戴明PDCA方法
  • 原文地址:https://www.cnblogs.com/cyd308/p/4771626.html
Copyright © 2020-2023  润新知