Codeforces Round #352 (Div. 2) C. Recycling Bottles
2016-05-17 20:20
393 查看
假设两人从垃圾桶出发捡完所有瓶子走过的距离为sum,接下里要做的就是选择两人从起始点出发捡的第一个瓶子(两人中有一个可以不捡瓶子,就是站在原地不动),更新sum, 从而使sum达到最小。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #define maxn 100005 #define INF 1e18 using namespace std; double x[maxn], y[maxn]; double a1, a2, b1, b2, t1, t2, sum; int n; void solve(double c1, double c2, double &s, int &p){ s = INF; for(int i = 1; i <= n; i++){ if(x[i] >= 0){ double dd = sqrt((x[i]-c1)*(x[i]-c1) + (y[i]-c2) * (y[i] - c2)); double d = sqrt((x[i]-t1) * (x[i]-t1) + (y[i]-t2) * (y[i]-t2)); if(s > dd - d){ s = dd - d; p = i; } } } } int main(){ //freopen("in.txt", "r", stdin); scanf("%lf%lf%lf%lf%lf%lf", &a1, &a2, &b1, &b2, &t1, &t2); scanf("%d", &n); for(int i = 1; i <= n; i++){ scanf("%lf%lf", x+i, y+i); sum += 2 * sqrt((x[i]-t1) * (x[i]-t1) + (y[i]-t2) * (y[i]-t2)); } double s1, s2; int p1, p2; solve(a1, a2, s1, p1); solve(b1, b2, s2, p2); if((s1 >= 0 && s2 >= 0) || s1 * s2 <= 0) sum += min(s1, s2); else{ if(p1 != p2) sum += s1 + s2; else{ double c1, c2; x[p1] = -1; solve(a1, a2, c1, p1); solve(b1, b2, c2, p2); if(c1 >= 0) c1 = 0; if(c2 >= 0) c2 = 0; sum += min(s1 + c2, s2 + c1); } } printf("%.12lf\n", sum); return 0; }
相关文章推荐
- Android开源框架Universal-Image-Loader源码解析
- audio标签
- adb 命令 dumpsys activity , 用来看 task任务栈 中的activity
- Java中的Object类介绍
- Javascript 面向对象编程(一):封装
- GDOI 2016 Day1 T4 疯狂动物城
- 排序七部曲之(五)归并排序
- fpm包安装-
- opencv2.4.10+VS2013安装
- hdu 1215 七夕节
- 只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs
- TCMalloc 对MySQL 性能 优化的分析
- linux服务器分析优化
- 有序表查找(二分查找,插值查找,斐波那契查找)
- TCP的连接建立与连接释放
- 二进制编码知识
- 四叠半神话大系(bfs序+st+在线倍增+二分)(北理16校赛)
- 学习move_base包
- string中c_str()、data()、copy(p,n)函数的用法
- poj2456 二分逼近寻找正确答案