博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
7624:山区建小学
阅读量:2125 次
发布时间:2019-04-30

本文共 1860 字,大约阅读时间需要 6 分钟。

描述

政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往。已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0 < i < m。为了提高山区的文化素质,政府又决定从m个村中选择n个村建小学(设 0 < n < = m < 500 )。请根据给定的m、n以及所有相邻村庄的距离,选择在哪些村庄建小学,才使得所有村到最近小学的距离总和最小,计算最小值。

输入

第1行为m和n,其间用空格间隔

第2行为(m-1) 个整数,依次表示从一端到另一端的相邻村庄的距离,整数之间以空格间隔。

例如

10 3

2 4 6 5 2 4 3 1 3
表示在10个村庄建3所学校。第1个村庄与第2个村庄距离为2,第2个村庄与第3个村庄距离为4,第3个村庄与第4个村庄距离为6,…,第9个村庄到第10个村庄的距离为3。

输出

各村庄到最近学校的距离之和的最小值。

样例输入

10 2

3 1 3 1 1 1 1 1 3

样例输出

18

AC

  • 在村庄之间建学校,最好建在中点
  • 新建的学校的管辖范围是它右边的村庄,它左边的一个学校到新建学校之间村庄的路程需要枚举判断
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define N 505#define P pair
#define ll long long#define mk(a, b) make_pair(a, b)#define mem(a, b) memset(a, b, sizeof(a))using namespace std;int inf = 0x3f3f3f3f;// dp[i][j] 表示建到第i村庄,已经建好j个学校所用的最短路径// dis[i] 表示从1到i的距离// dist[i][j] 表示第i个村庄到第j个村庄的距离// c[i][j] 表示在第i个村庄和第j个村庄之间建一个学校的路径长度int dp[N][N], dis[N], dist[N][N], c[N][N];int find (int i, int j) { int mid = (i + j) / 2; int sum = 0; for (int k = i; k <= j; ++k) { sum += dist[k][mid]; } return sum;}int main(){#ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin);#endif int n, m; cin >> n >> m; // 从 1 到 i 的距离 dis[i] for (int i = 2; i <= n; ++i) { cin >> dis[i]; dis[i] += dis[i - 1]; } // i 到 j 的距离 dist[i][j] for (int i = 1; i <= n; ++i) { for (int j = i; j <= n; ++j) { dist[i][j] = dist[j][i] = dis[j] - dis[i]; } } for (int i = 1; i <= n; ++i) { for (int j = i; j <= n; ++j) { c[i][j] = c[j][i] = find(i, j); } } mem(dp, inf); // 修建一所学校 for (int i = 1; i <= n; ++i) { dp[i][1] = c[1][i]; dp[i][i] = 0; } // 枚举所有学校 for (int i = 2; i <= n; ++i) { // 最多修的学校 for (int j = 2; j <= min(i, m); ++j) { // 枚举前面一个学校到新建学校的路程 for (int k = j - 1; k < i; ++k) { dp[i][j] = min(dp[i][j], dp[k][j - 1] + c[k + 1][i]); } } } cout << dp[n][m] << endl; return 0;}

转载地址:http://vkprf.baihongyu.com/

你可能感兴趣的文章
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>
Redis学习笔记(四)—— redis的常用命令和五大数据类型的简单使用
查看>>
Win10+VS2015编译libcurl
查看>>
Windows下使用jsoncpp
查看>>
Ubuntu下测试使用Nginx+uWsgi+Django
查看>>
Windows下编译x264
查看>>
visual studio调试内存泄漏工具
查看>>
开源Faac实现PCM编码AAC
查看>>
Windows下wave API 音频采集
查看>>
借船过河:一个据说能看穿你的人性和欲望的心理测试
查看>>
AndroidStudio 导入三方库使用
查看>>
Ubuntu解决gcc编译报错/usr/bin/ld: cannot find -lstdc++
查看>>
解决Ubuntu14.04 - 16.10版本 cheese摄像头灯亮却黑屏问题
查看>>
解决Ubuntu 64bit下使用交叉编译链提示error while loading shared libraries: libz.so.1
查看>>
VS生成DLL文件供第三方调用
查看>>
Android Studio color和font设置
查看>>
Python 格式化打印json数据(展开状态)
查看>>
Centos7 安装curl(openssl)和libxml2
查看>>
Centos7 离线安装RabbitMQ,并配置集群
查看>>
Centos7 or Other Linux RPM包查询下载
查看>>