Problem W UVA 662 二十三 Fast Food

Fast Food
Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu
Submit  Status  Practice  UVA 662
Appoint description: System Crawler  (2015-08-27)

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

 

 

\begin{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  d i 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\n",k,mid,n);
17         else
18             printf("Depot %d at restaurant %d serves restaurants %d to %d\n",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\n",cas++);
66         put(K,n);
67         printf("Total distance sum = %d\n\n",dp[K][n]);
68     }
69     return 0;
70 }
View Code

 

转载于:https://www.cnblogs.com/cyd308/p/4771626.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值