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

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

Solution

为了使几个区域的人口更加接近,所以先排序,然后考虑怎样将几个区域的人口分为一段,使得误差最小。又因为i号位之前的分法对于之后的分法没有影响,所以果断DP。如果用f[i][j]表示前i个区域分成j段,再去枚举这i个区域最后一段切在哪里(k),就能得到状态转移方程:f[i][j]=min(f[i][j],f[k][j-1]+(k+1到i号位的误差));

那么就要用前缀和处理出把i到j号位分成一段的误差(1<=i<=j<=n),可离线读取。s为a的前缀和数组,那么i到j位的误差就是(mid为i到j的中位数),a[mid]*(mid-i)-(s[mid-1]-s[i-1])+(s[j]-s[mid])-a[mid]*(j-mid),画数轴自己推一下会好理解得多。

Code

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int a[];
long long s[],w[][],f[][];
int main()
{
int n,m;
cin>>n>>m;
for (int i=; i<=n; i++)
cin>>a[i];
sort(a+,a+n+);//先排序
for (int i=; i<=n; i++)
s[i]=s[i-]+a[i];//前缀和
int mid;
for (int i=; i<=n; i++)
for (int j=i; j<=n; j++)
{
mid=(i+j)/;
w[i][j]=a[mid]*(mid-i)-(s[mid-]-s[i-])+(s[j]-s[mid])-a[mid]*(j-mid);//w数组存的是区间的误差
}
for (int i=; i<=n+; i++)
for(int j=; j<=m+; j++)
f[i][j]=;
f[][]=;
for (int i=; i<=n; i++)
for (int j=; j<=m; j++)
for (int k=; k<=i-; k++)
f[i][j]=min(f[i][j],f[k][j-]+w[k+][i]);
cout<<f[n][m]<<endl;
return ;
}

Source

http://www.lydsy.com/JudgeOnline/problem.php?id=2933

BZOJ2933:POI1999地图的更多相关文章

  1. BZOJ2933: [Poi1999]地图

    Description   一个人口统计办公室要绘制一张地图.由于技术的原因只能使用少量的颜色.两个有相同或相近人口的区域在地图应用相同的颜色.例如一种颜色k,则A(k) 是相应的数,则有: 在用颜色 ...

  2. BZOJ2933 [Poi1999]地图【区间DP】

    Description 一个人口统计办公室要绘制一张地图.由于技术的原因只能使用少量的颜色.两个有相同或相近人口的区域在地图应用相同的颜色.例如一种颜色k,则A(k) 是相应的数,则有: 在用颜色k的 ...

  3. BZOJ 2933([Poi1999]地图-区间Dp)

    2933: [Poi1999]地图 Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 7   Solved: 7 [ Submit][ Status] ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. Java 征途:行者的地图

    前段时间应因缘梳理了下自己的 Java 知识体系, 成文一篇望能帮到即将走进或正在 Java 世界跋涉的程序员们. 第一张,基础图 大约在 2003 年我开始知道 Java 的(当时还在用 Delph ...

  6. 【详细教程】论android studio中如何申请百度地图新版Key中SHA1值

    一.写在前面 现在越来越多的API接口要求都要求提供我们的项目SHA1值,开发版目前还要求不高,但是发布版是必定要求的.而目前定位在各大APP中也较为常见,当下主流的百度地图和高德地图都在申请的时候会 ...

  7. C# 程序中嵌入百度地图

    本例是对WinForm中使用百度地图的简要介绍.百度地图目前支持Android开发,IOS开发,Web开发,服务接口,具体可以参照'百度地图开放平台'. [动态加载百度地图]涉及到的知识点: WebB ...

  8. 高德地图api实现地址和经纬度的转换(python)

    利用高德地图web服务api实现地理/逆地址编码 api使用具体方法请查看官方文档 文档网址:http://lbs.amap.com/api/webservice/guide/api/georegeo ...

  9. Highcharts中国地图热力图

    最近有个项目需要将MC销量按大陆各省统计,并以中国地图人力图效果显示.由于项目一直使用Highcharts进行图表的统计,故采用Highmaps来实现. 效果如下: 1)中国各个省.直辖市.自治区: ...

随机推荐

  1. 在nginx日志的access log中记录post请求的参数值

    背景:有时程序偶出现参数少了或没有提交到下一个链接Url里后出现问题,如何查呢,最好的办法是在nginx上的加post参数,以定位到问题才有可能对某个UIR的代码出现的问题进行排查. og_forma ...

  2. caffe学习笔记(一),ubuntu14.04+GPU (用Pascal VOC2007训练数据,并测试)

    把源代码跑起来了,将实验过程记录如下,用于新手入门. 今天和师兄师姐才跑通,来分享下心得.(预训练网络:ImageNet_model,训练集:PASCAL VOC2007, GPU) 首先,整个tra ...

  3. (四)SQL入门 数据库的操作与事务管理

    数据库的操作,有三个最基本的语句,insert插入,update修改,delete删除. 不同的数据库厂商的实现可能不同,所以就不说具体的语法怎么写的了.说语法也没有意义,到处都可以复制粘贴,记得听某 ...

  4. Angular初学

    简介: angularjs是基本js开发的一个前端类库,主要致力于减轻开发人员在开发Ajax应用过程中的痛苦,适合来做单应用. 客户端模板: Angualr中,模板和数据都会被发送到浏览器中,然后在客 ...

  5. 在eclipse上开发nodejs

    首先到官网下载nodejs.地址:https://nodejs.org/en,可根据自己的操作系统选择下载. 安装好后.进入命令行输入node ,然后输入console.log("hello ...

  6. phpcms V9 常用函数 及 代码整理

    常用函数 及 常用代码 总结如下 <?php //转换字符串或者数组的编码 str_charset($in_charset, $out_charset, $str_or_arr) //获取菜单 ...

  7. Bitnami Redmine插件记录

    1.bitnami安装时自带了开发环境,如ruby.rails.devkit. 为了版本兼容,应使用bitnami的命令行. 2.通过use_redmine启动命令行:运行Bitnami\redmin ...

  8. c++ 注册类到 lua

    test.h: #ifndef __TEST_H__ #define __TEST_H__ class CTest { public: CTest(); ~CTest(); int getA(); v ...

  9. clock()、time()、clock_gettime()和gettimeofday()函数的用法和区别【转】

    转自:http://www.cnblogs.com/krythur/archive/2013/02/25/2932647.html 转自http://blog.sina.com.cn/s/blog_7 ...

  10. webstorm--破解

    2016.2.2 版本的破解方式: 安装以后,打开软件会弹出一个对话框:选择"license server" 输入:http://114.215.133.70:41017 2016 ...