UVA662- Fast Food

题意:在一条公路上,有n个酒店,要建造k个供给站(建造在酒店所在的位置),给出酒店的位置,求怎么样建造供给站才能使得每个酒店都能得到服务且所要走的路程最短。

思路:在i到j酒店建立一个供给站,要使得路程和最短,要将供给站建立在中间。如果i到j为偶数时,可以建立在中间两个数其中一个地方,如果是奇数时,应该建立在(i + j) / 2的地方。我们可以预处理从i到j酒店的最短路程和dis[i][j]。所以可以得到d[i][j]表示i个供给站为前j个酒店服务时的最短路程和。之后的输出可以在计算的时候加入一个记录数组,记录分割的地方,然后递归输出。

状态转移方程:d[i][j] = min(d[i][j], d[i - 1][k] + dis[k + 1][j]); (1 <= k <  j)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>

typedef long long ll;
using namespace std;

const int MAXN = 205;
const int INF = 0x3f3f3f3f;

int p[MAXN], vis[MAXN][MAXN];
ll dis[MAXN][MAXN], d[MAXN][MAXN];
int n, m;

void init() {
    memset(vis, 0, sizeof(vis));
    memset(dis, 0, sizeof(dis));
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            for (int k = i; k <= j; k++)
                dis[i][j] += abs(p[(i + j) / 2] - p[k]);

    for (int i = 0; i <= m; i++)
        for (int j = 0; j <= n; j++)
            d[i][j] = INF;

    for (int i = 1; i <= n; i++)
        d[1][i] = dis[1][i];
}

void outPut(int cnt, int x, int y) {
    printf("Depot %d at restaurant %d serves ", cnt, (x + y) / 2);
    if (x == y)
        printf("restaurant %d\n", x);
    else
        printf("restaurants %d to %d\n", x, y);
}

void print(int x, int y) {
    if (x > 1)
        print(x - 1, vis[x][y]);
    outPut(x, vis[x][y] + 1, y);
}

int main() {
    int t = 1;
    while (scanf("%d %d", &n, &m) && n || m) {
        for (int i = 1; i <= n; i++)
            scanf("%d", &p[i]);
        init();

        for (int i = 2; i <= m; i++)
            for (int j = i; j <= n; j++)
                for (int k = i - 1; k < j; k++)
                    if (d[i][j] > d[i - 1][k] + dis[k + 1][j]) {
                        d[i][j] = d[i - 1][k] + dis[k + 1][j];
                        vis[i][j] = k;
                    }

        printf("Chain %d\n", t++);
        print(m, n);
        printf("Total distance sum = %lld\n\n", d[m][n]);

    }
}

UVA662- Fast Food

时间: 2024-11-25 20:21:23

UVA662- Fast Food的相关文章

uva662 - Fast Food(递推)

题目:uva662 - Fast Food(递推) 题目大意:要求在同一条路上的N家快餐店,新建K个补助站点,每个快餐店和它的补助站点的距离之和最小.并且输出路径. 解题思路:这题之前想了很久,但是却漏掉最重要的一点:一条路上[1,N]快餐店,建一个补助站的话,建在中间是最优的.那么对于一个补助站是这样的,对于两个补助站的话,就看这两个补助站提供补助的范围了.dp[k][j]表示在前j家快餐店建了k个补助站最小的补助距离.dp[k][j] = Min (dp[k - 1][i] + s[i +

Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

1.事件描述:CentOS7下使用tree命令,发现该命令没有被安装,在安装的过程中发现yum报错 [[email protected] ~]# tree -d bash: tree: 未找到命令... [[email protected] ~]# yum -y install tree 已加载插件:fastestmirror, langpacks Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

UVA 11992(Fast Matrix Operations-线段树区间加&amp;改)[Template:SegmentTree]

Fast Matrix Operations There is a matrix containing at most 106 elements divided into r rows and c columns. Each element has a location (x,y) where 1<=x<=r,1<=y<=c. Initially, all the elements are zero. You need to handle four kinds of operati

Fast Paxos(转)

自从Lamport在1998年发表Paxos算法后,对Paxos的各种改进工作就从未停止,其中动作最大的莫过于2005年发表的Fast Paxos.无论何种改进,其重点依然是在消息延迟与性能.吞吐量之间作出各种权衡.为了容易地从概念上区分二者,称前者Classic Paxos,改进后的后者为Fast Paxos. 1. Fast Paxos概览 Lamport在40多页的论文中不仅提出了Fast Paxos算法,并且还从工程实践的角度重新描述了Paxos,使其更贴近应用场景.从一般的Client

HDU 4965 Fast Matrix Calculation 【矩阵】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4965 题目大意:给你一个N*K的矩阵A以及一个K*N的矩阵B (4 <= N <= 1000)以及 (2 <=K <= 6),然后接下来四步: 算一个新的矩阵C=A*B 算M=C^ (N*N) 对于M中的每个元素%6 将M中每个元素加起来,算出和. 也就是求出A*B * A*B * A*B * A*B * A*B *--* A*B   但是A*B形成的矩阵是N*N,而N大小有可能是10

Fast检测角点算法

1.角点定义 角点是一种局部特征,具有旋转不变性和不随光照条件变化而变化的特点,一般将图像中曲率足够高或者曲率变化明显的点作为角点.检测得到的角点特征通常用于图像匹配.目标跟踪.运动估计等方面. 2.Fast检测角点 1)基本思想 E.Rosten和T.Drummond两位大佬在06年一篇文章中提出了FAST特征算法,基本思想十分简单:以某个像素点为圆心,某半径的圆周上其他像素点与圆心像素点特性差异达到某种标准时即认为该点就是角点. 2)数学模型 经过测试发现,选取的圆形半径为3时可以兼顾检测结

Linux内核协议栈 NAT性能优化之FAST NAT

各位看官非常对不起,本文是用因为写的,如果多有不便敬请见谅 代码是在商业公司编写的,在商业产品中也不能开源,再次抱歉 This presentation will highlight our efforts on optimizing the Linux TCP/IP stack for providing networking in an OpenStack environment, as deployed at our industrial customers. Our primary go

快速近似最近邻搜索库 FLANN - Fast Library for Approximate Nearest Neighbors

What is FLANN? FLANN is a library for performing fast approximate nearest neighbor searches in high dimensional spaces. It contains a collection of algorithms we found to work best for nearest neighbor search and a system for automatically choosing t

11G新特性 -- ASM Fast Mirror Resync

ASM Fast Mirror Resync     在oracle 10g中,如果asm磁盘因为光纤.控制器发生故障而发生failure,asm将无法继续向该磁盘中写入数据.     asm会将发生failure的磁盘变为offline,等从其它冗余组同步完数据后,将该磁盘drop.asm不会再从被offline的磁盘读取数据,因为asm认为该磁盘的数据是过期的.     即使failure的磁盘被自动修复,也需要手动将磁盘重新插回重新数据同步.     1.将磁盘offline,并指定dro

OpenCV中feature2D学习——FAST特征点检测

在前面的文章<OpenCV中feature2D学习--SURF和SIFT算子实现特征点检测>中讲了利用SIFT和SURF算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测. FAST的全名是:Features from Accelerated Segment Test,主要特点值计算速度快,比已知的其他特征点检测算法要快很多倍,可用于计算机视觉应用的实时场景.目前以其高计算效率(computational performance).高可重复性(highrepeatability)成为