博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ3154 Graveyard
阅读量:5272 次
发布时间:2019-06-14

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

  原题传送:

  模型转换一下,把圆形的路从某个雕塑处剪开拉成一条直线,这样就很容易处理出添加雕塑前后的位置数组a[N]和c[N+M]。对于原状态的一个雕塑a[i],在新位置数组c[N+M]中找出小于等于a[i]的位置c[j],然后取位置j和其相邻两点j-1、j+1(如果有的话)距离的最小值(a[i] - min(c[j-1], c[j], c[j+1]))为a[i]须移动的最短距离。

  原来想的时候会顾虑这样一个问题:在原来的位置数组a[N]中会不会出现相邻的两个点a[i],a[i+1]同时和c[j]距离最近,也就是说上述思想会不会导致a[i]和a[i+1]移到同一个位置?其实是不会出现这种情况的,可以画个数轴分析一下,如果雕塑增多了,那么原来雕塑肯定在新位置数组的两点之间,如果同时位于中点,上述分析显然成立,如果不同时位于中点,那么,便会偏向同一侧而不会取这两点中间的c[j]。

View Code
1 #include 
2 #include
3 #include
4 #include
5 #define N 1005 6 using namespace std; 7 8 int n, m; 9 double a[N], c[N * 2];10 11 int main()12 {13 int i;14 double j, d, ans;15 while(scanf("%d%d", &n, &m) == 2)16 {17 d = 10000.0 / n;18 for(j = 0.0, i = 0; i < n; i ++, j += d)19 a[i] = j;20 d = 10000.0 / (n + m);21 for(j = 0.0, i = 0; i < n + m; i ++, j += d)22 c[i] = j;23 24 double k;25 for(ans = 0.0, i = 0; i < n; i ++)26 {27 int loc = lower_bound(c, c + n + m, a[i]) - c;28 k = fabs(a[i] - c[loc]);29 if(loc > 0)30 k = min(k, fabs(a[i] - c[loc - 1]));31 if(loc < n + m - 1)32 k = min(k, fabs(a[i] - c[loc + 1]));33 ans += k;34 }35 printf("%.4f\n", ans);36 }37 return 0;38 }

转载于:https://www.cnblogs.com/huangfeihome/archive/2012/11/02/2750895.html

你可能感兴趣的文章
关闭Chrome浏览器的自动更新和升级提示
查看>>
移动、尺寸改变
查看>>
负载均衡策略
查看>>
微信智能开放平台
查看>>
ArcGIS Engine 中的绘制与编辑
查看>>
Oracle--通配符、Escape转义字符、模糊查询语句
查看>>
c# 文件笔记
查看>>
第一页 - 工具的使用(webstorm)
查看>>
Linux 进程资源用量监控和按用户设置进程限制
查看>>
D3.js 之 d3-shap 简介(转)
查看>>
制作满天星空
查看>>
类和结构
查看>>
CSS3选择器(二)之属性选择器
查看>>
adidas crazylight 2018 performance analysis review
查看>>
typeset shell 用法
查看>>
python 之 循环语句
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
[转]ceph网络通信模块_以monitor模块为例
查看>>
HDOJ 1754 I Hate It(线段树基本操作)
查看>>
latex tree
查看>>