https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=20&page=show_problem&problem=1709

在一个周长为10000的圆上等距分布着n个雕塑。现在又有m个新雕塑加入(位置可以随意放),希望所有n+m个雕塑在圆周上均匀分布。这就需要移动其中一些原有的雕塑。要求n个雕塑移动的总距离尽量小。

2<=n<=1000, 1<=m<=1000,输出最小总距离,精确到10-4

这题是《算法竞赛入门经典--训练指南》第七页的一道例题,作者分析的时候声称一定有一个雕塑没有移动,但是没给出证明

我也没法给出证明,因为里面涉及到round(返回最接近的整数)这种非线性函数,有点难处理

但是我想到可以用Matlab画个图验证一下是不是这样,其实只要确定旧的n个点中的一个点在新的n+m个点构成的环上的位置,其余的点就都确定了,我们随便找一个点,让它在一个区间上移动,算出其在各个位置处对应的总距离。我预计这个图可能是中间凹,两边高,实际上并非如此,而是有很多峰。

在这个图中,n=7(注意到图中恰有7个峰),m=32,区间被分成1000份。峰的个数似乎是n/gcd(n,m),对n=8,m=32和n=6,m=2都成立,但是对n=8,m=18就不成立(没有峰),我表示搞不懂,归纳不出这个公式……

所以,从图中可见,让该点处于区间一端确实可以使得总距离最小,但是这个点还有其他位置可以放,如上图中区间中部的6个最低点。(但是作者声称的一定有一个雕塑没移动,貌似也是对的)

Matlab代码如下:

%uva online judge LA 3708, test, <算法竞赛入门经典训练指南>第7页
n = 7;%original points on a circle
m = 32;% points to be added
dist = (n + m) / n;
step = 0.001;
total = zeros(1, 1 / step + 1);
t_idx = 0;
for start = 0 : step : 1
t_idx = t_idx + 1;
for idx = 0 : n - 1
point = start + idx * dist;
total(t_idx) = total(t_idx) + abs(point - round(point));
end
end
plot(total) %此图与m无关,只与n有关

另外还画了一个在取定一个雕塑不动的情况下,总距离随m,n变化的3D图:

代码如下:

%uva online judge LA 3708, test2, <算法竞赛入门经典训练指南>第7页
%假设圈长为1,为计算方便,先假设圈长为n+m,然后再缩放一下
%n = 7;%original points on a circle
%m = 8;% points to be added MAX = 30;%max test points for n
total = zeros(MAX, MAX);
start = 0;
for n = 1:MAX
for m = 1 : MAX
dist = (n + m) / n;
for idx = 0 : n - 1
point = start + idx * dist;
total(n,m) = total(n,m) + abs(point - round(point));
end
total(n,m) = total(n,m) / (m + n);
end
end
figure, mesh(total)

墓地雕塑-LA3708的更多相关文章

  1. 【贪心】【POJ3154】墓地雕塑(Graveyard, NEERC 2006, LA 3708)需要稍稍加工的(先贪心,再确保能这样贪(可行性&&如果可行必定最优&&非证明最优性)的题)(K)

    例题4  墓地雕塑(Graveyard, NEERC 2006, LA 3708) 在一个周长为10000的圆上等距分布着n个雕塑.现在又有m个新雕塑加入(位置可以随意放),希望所有n+m个雕塑在圆周 ...

  2. C/C++每日小练(七)——墓地雕塑

    墓地雕塑 题目描写叙述: 在一个周长为10000的圆上等距分布着n个雕塑. 如今又有m个新雕塑增加(位置能够任意放).希望全部n+m个雕塑在圆周上均匀分布.这就须要移动当中一些原有的雕塑.要求n个雕塑 ...

  3. Java实现蓝桥杯墓地雕塑

    墓地雕塑 问题描述 在一个周长为10000的圆上等距分布着n个雕塑.现在又有m个新雕塑加入(位置可以随意放), 希望所有n+m个雕塑在圆周上均匀分布.这就需要移动其中一些原有的雕塑.要求n个雕塑移动的 ...

  4. LA3708墓地雕塑

    题意:       有N个墓碑,等距离的分布在一个圆形墓地的周围,然后又要添加m个墓碑,最后要求所有的墓碑还是等距离,添加的墓碑可以放在任意位置,问之前的N个墓碑的最少移动距离之和是多少? 思路:   ...

  5. [ACM_数学] LA 3708 Graveyard [墓地雕塑 圈上新加点 找规律]

    Description   Programming contests became so popular in the year 2397 that the governor of New Earck ...

  6. LA 3708 Graveyard 墓地雕塑 NEERC 2006

    在一个周长为 10000 的圆上等距分布着 n 个雕塑.现在又有 m 个新雕塑加入(位置可以随意摆放),希望所有 n + m 个雕塑能在圆周上均匀分布.这就需要移动一些原有的雕塑.要求 n 个雕塑移动 ...

  7. LA 3708 墓地雕塑

    题目链接:https://vjudge.net/contest/132704#problem/D 题意:一个长度为10000的园上,均匀分布n个雕塑,现在要加入m个雕塑,这样原先的就可能会移动,求移动 ...

  8. LA 3708 墓地雕塑(模拟)

    题目链接:https://vjudge.net/problem/UVALive-3708 这道题的思路也是比较难想. 首先根据上一题(Uva 11300)可知,要想让移动距离最短,那么至少要使一个雕塑 ...

  9. LA 3708

    题意:       在一个周长为10000的圆上等距分布着n 个雕塑,现在又有m 个新雕塑加入(位置可以随意放置), 希望所有(n+m)个雕塑在圆周上均匀分布,这就需要移动其中一些雕塑,要求n个雕塑移 ...

随机推荐

  1. mybatis乐观锁实现,解决并发问题

    银行两操作员同时操作同一账户就是典型的例子.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后提交.最后实际账户余额为100 ...

  2. [jQuery学习系列一]1-选择器与DOM对象

    前言: 好久没有更新博客了, 最近想复习下 之前学过的JS的相关内容, 也算是自己的一种总结. 知识长时间不用就会忘记, 多学多记多用!! 下面的程序都可以在下面的网站进行在线调试: http://w ...

  3. eclipse 打开是报错"reload maven project has encountered a problem"

    不需要删除整个 .metadata 如果删除这个代价是重新导入全部项目 D:\eclipse-workspace\.metadata\.plugins\org.eclipse.e4.workbench ...

  4. Leetcode 7 Reverse Integer 数论

    题意:将整数倒置,该题简单但是需要注意数据的范围,难得的好题. 如果出现1000000003或者-2000000003,倒置后的数超过int的范围,因此返回0,出现这种情况可以使用long long, ...

  5. javascript设计模式与开发实践阅读笔记(9)——命令模式

    命令模式:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么,此时希望用一种松耦合的方式来设计软件,使得请求发送者和请求接收者能够消除彼此之间的耦合关系. 说法很复 ...

  6. Moses在Ubuntu14.04平台的安装过程

    平台环境:在windows 7中建立VMware虚拟机,操作系统为Ubuntu_14.04_amd_64 1.安装GIZA++ 安装步骤如下: wget http://giza-pp.googleco ...

  7. Linux下远程桌面Windows

    rdesktop-1.7.0.tar.gz [root@localhost fcitx]# tar rdesktop-1.7.0.tar.gz [root@localhost fcitx]#cd rd ...

  8. OC中如何把数组中字典的数据转换成URL?

    在使用objective-c语言开发iOS应用中,会向服务器通过URL请求一些数据,因此对URL的拼接肯定少不了.而在iOS中,我们一般是通过将字典中的数据拼接成我们要请求的URL字符串,那这个是怎么 ...

  9. APP顶号逻辑

    登录的接口login.do接口上需要记录关键的信息:userId.设备型号(Android|iPhone).登录时间.登录IP.设备唯一标识(UUID) 当在另外一台新设备上登录同一帐号时,将user ...

  10. Adafruit的树莓派教程第五课:使用控制电缆

    Adafruit的树莓派教程第五课:使用控制电缆 时间 2014-05-09 01:11:20 极客范 原文 http://www.geekfan.net/9095/ 主题 Raspberry PiM ...