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

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

题目描述

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

输入输出格式

输入格式:

 

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

第2行为n-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。

 

输出格式:

 

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

 

输入输出样例

输入样例#1: 
10 23 1 3 1 1 1 1 1 3
输出样例#1: 
18

说明

0 < mm <= nn < 500

0 < d_idi <=100

#include
#define REP(i, a, b) for(int i = (a); i <= (b); ++ i)#define REP(j, a, b) for(int j = (a); j <= (b); ++ j)#define PER(i, a, b) for(int i = (a); i >= (b); -- i)#define REP(k, a, b) for(int k = (a); k <= (b); ++ k)using namespace std;const int maxn=505;template
inline void rd(T &ret){ char c; ret = 0; while ((c = getchar()) < '0' || c > '9'); while (c >= '0' && c <= '9'){ ret = ret * 10 + (c - '0'), c = getchar(); }}int n,m,dis[maxn],dp[maxn][maxn],w[maxn][maxn];int main(){ rd(n),rd(m); REP(i,2,n)rd(dis[i]),dis[i]+=dis[i-1]; REP(i,1,n){ REP(j,i,n){ int mid=i+j>>1; REP(k,i,j){ w[i][j]+=abs(dis[mid]-dis[k]); } } } REP(i,0,n){ REP(j,0,m){ dp[i][j]=0x3f3f3f3f; } } dp[0][0]=0; REP(i,1,n){ REP(j,1,m){ if(j>i){ dp[i][j]=0; continue; } REP(k,j-1,i){ dp[i][j]=min(dp[i][j],dp[k][j-1]+w[k+1][i]); } } } cout<
<

 

转载于:https://www.cnblogs.com/czy-power/p/10453771.html

你可能感兴趣的文章
Python内建函数getattr备注
查看>>
Lammp的搭建
查看>>
贪心算法-活动选择
查看>>
Material Design Lite ,简洁惊艳的前端工具箱。
查看>>
20.22 告警系统监控项目
查看>>
Python网络编程之协程
查看>>
定制更友好的iptables防火墙
查看>>
用sql语句对access数据库进行多条件查询
查看>>
php操作ini配置文件
查看>>
dataguard主备延迟多长时间的查询方法
查看>>
[Array]628. Maximum Product of Three Numbers
查看>>
C++函数模板&类模板
查看>>
spring事件广播
查看>>
javascript事件委托和jquery事件委托
查看>>
使用ReaderWriterLock类实现多用户读/单用户写同步
查看>>
MySQL--Basic(一)
查看>>
(转)CSS字体大小: em与px、pt、百分比之间的对比
查看>>
C语言的关键字
查看>>
喷水装置(一)NYOJ6
查看>>
填充与步幅
查看>>