博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2933: [Poi1999]地图
阅读量:5113 次
发布时间:2019-06-13

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

Description

 
一个人口统计办公室要绘制一张地图。由于技术的原因只能使用少量的颜色。两个有相同或相近人口的区域在地图应用相同的颜色。例如一种颜色
k,则
A(
k) 是相应的数,则有:
  • 在用颜色k的区域中至少有一半的区域的人口不大于A(k)
  • 在用颜色k的区域中至少有一半的区域的人口不小于A(k)
区域颜色误差是该区域的人口与
A(
k)差的绝对值。
累计误差是所有区域颜色误差的总和。我们要求出一种最佳的染色方案(累计误差最小)。
任务
写一个程序:
  • 读入每个区域的人口数
  • 计算最小的累计误差
  • 将结果输出

Input

 
第一行有一个整数
n,表示区域数,
10< n <3000。在第二行中的数
m表示颜色数,
2 <= m <= 10。在接下来的
n中每行有一个非负整数,表示一个区域的人口。人口都不超过
2^30

Output

输出一个整数,表示最小的累计误差

Sample Input

11
3
21
14
6
18
10
2
15
12
3
2
2

Sample Output

15
题解:首先我们很容易想到,要使误差小,先将所有的省区排序,再来考虑将这些省区分段,一段算作一个颜色。
然后设f[i][j]为前i个省区用j个颜色的最小误差,W[i][j]设为i~j省区为同个颜色会带来的误差,先通过前缀和把w数组处理好,然后用一个变量k来松弛i~j这个区间,若k+1~i为同个颜色 ,则f[i][j]=min(f[i]][j],f[k][j-1]+w[k+1][i]]);
不过前缀和的地方要稍微推一下。
#include
#include
#include
using namespace std;int n,m,mid,a[3005],w[3005][3005],f[3005][20];long long s[3005],k1,k2;int min(int a,int b){ if (a>b) return b; else return a;}int main(){ cin>>n>>m; for (int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); s[0]=0; for (int i=1;i<=n;i++) s[i]+=s[i-1]+a[i]; for (int i=1;i<=n;i++) for (int j=i;j<=n;j++) { mid=(i+j+1)/2; k1=a[mid]*(mid-i)-(s[mid-1]-s[i-1])+(s[j]-s[mid])-a[mid]*(j-mid);//把这段区间涂成一个颜色所会带来的误差值 w[i][j]=k1; } for (int i=0;i<=n+1;i++) for (int j=0;j<=m+1;j++) f[i][j]=1073741825; f[0][0]=0; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) for (int k=0;k<=i-1;k++) f[i][j]=min(f[i][j],f[k][j-1]+w[k+1][i]);//把它分成两段,k+1~i用一个颜色 cout<
<

 

 

转载于:https://www.cnblogs.com/2014nhc/p/6236578.html

你可能感兴趣的文章
使用pygal_maps_world.i18n中数据画各大洲地图
查看>>
sql server必知多种日期函数时间格式转换
查看>>
ListView如何获取点击单元格内容
查看>>
jQuery EasyUI 的下拉选择combobox后台动态赋值
查看>>
(转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)
查看>>
timeline时间轴进度“群英荟萃”
查看>>
python map函数用法
查看>>
ios之申请后台延时执行和做一个假后台的方法(系统进入长时间后台后,再进入前台部分功能不能实现)...
查看>>
编码命名规范
查看>>
耿丹16-1上半学期助教总结
查看>>
python if else elif statement
查看>>
网络编程
查看>>
文本隐藏(图片代替文字)
查看>>
three.map.control
查看>>
二叉树的深度
查看>>
java面试题
查看>>
提高码力专题(未完待续)
查看>>
IOS第17天(3,Quartz2D画板和画线)
查看>>
pair的例子
查看>>
前端框架性能对比
查看>>