[Codeforces 30D] Kings Problem
Brief Intro:
有n+1个点,其中n个点在X轴上,求从第k个点出发最短的汉密尔顿路径
Solution:
分类讨论+逐个枚举
设dist(i)是第i个点到n+1的距离
cal1(l,r)是n+1到dat[l]~dat[r]的最短距离
cal2(l,r)是dat[k]到dat[l]~dat[r]再到n+1的最短距离
1、如果k=n+1,则答案明显是线段长+min(dist(1),dist(n))
2、否则要逐个枚举
可以发现共有2种可能:n+1连到线段的边有1条/2条
如为1条,则结果为cal1(1,n);
如为2条,则可将路径分为dat[k]到dat[l]~dat[r]再到n+1 + n+1到剩余的点
明显剩余的点连续时有最优解
于是res[i]=min( cal1(1,i-1)+cal2(i,n) , cal2(1,i-1)+cal1(i,n) )。
Code:
#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+;
double dat[MAXN],x,y,kx;
int n,k; double dist(int pos){return hypot(x-dat[pos],y);} double cal1(int l,int r)
{
return dat[r]-dat[l]+min(dist(l),dist(r));
} double cal2(int l,int r)
{
return dat[r]-dat[l]+min(dist(l)+fabs(kx-dat[r]),dist(r)+fabs(kx-dat[l]));
} int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) scanf("%lf",&dat[i]);
scanf("%lf%lf",&x,&y); kx=dat[k];sort(dat+,dat+n+); double res;
if(k==n+) res=cal1(,n);
else
{
res=cal2(,n);
for(int i=;i<=n;i++)
res=min(res,min(cal1(,i-)+cal2(i,n),cal2(,i-)+cal1(i,n)));
}
printf("%.10f",res);
return ;
}
[Codeforces 30D] Kings Problem的更多相关文章
- codeforces 340C Tourist Problem
link:http://codeforces.com/problemset/problem/340/C 开始一点也没思路,赛后看别人写的代码那么短,可是不知道怎么推出来的啊! 后来明白了. 首先考虑第 ...
- codeforces B. Routine Problem 解题报告
题目链接:http://codeforces.com/problemset/problem/337/B 看到这个题目,觉得特别有意思,因为有熟悉的图片(看过的一部电影).接着让我很意外的是,在纸上比划 ...
- Codeforces 527D Clique Problem
http://codeforces.com/problemset/problem/527/D 题意:给出一些点的xi和wi,当|xi−xj|≥wi+wj的时候,两点间存在一条边,找出一个最大的集合,集 ...
- Codeforces 706C - Hard problem - [DP]
题目链接:https://codeforces.com/problemset/problem/706/C 题意: 给出 $n$ 个字符串,对于第 $i$ 个字符串,你可以选择花费 $c_i$ 来将它整 ...
- Codeforces 1096D - Easy Problem - [DP]
题目链接:http://codeforces.com/problemset/problem/1096/D 题意: 给出一个小写字母组成的字符串,如果该字符串的某个子序列为 $hard$,就代表这个字符 ...
- Codeforces 793C - Mice problem(几何)
题目链接:http://codeforces.com/problemset/problem/793/C 题目大意:给你一个捕鼠器坐标,和各个老鼠的的坐标以及相应坐标的移动速度,问你是否存在一个时间点可 ...
- CodeForces 687A NP-Hard Problem
Portal:http://codeforces.com/problemset/problem/687/A 二分图染色 好模板题 有SPJ 值得注意的是,因为C++的奇妙的运算机制 若在vector变 ...
- Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset
Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...
- Codeforces Gym 100342C Problem C. Painting Cottages 转化题意
Problem C. Painting CottagesTime Limit: 2 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
随机推荐
- NEYC 2017 自动取款机 atm Day6 T1
自动取款机 [问题描述] 小 ...
- BZOJ1191:超级英雄(二分图匹配)
[HNOI2006]超级英雄Hero 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1191 Description: 现在电视台有一种节 ...
- CSS中background-position使用技巧
一.background-position:left top; 背景图片的左上角和容器(container)的左上角对齐,超出的部分隐藏.等同于 background-position:0,0;也等同 ...
- 智能合约安全-parity多重签名钱包安全漏洞
漏洞原因: 因为initWallet函数是公开函数( public function) , 攻击者调用initWallet,重新初始化钱包会把之前合约钱包所有者覆盖, 即可改变钱包所有者. 漏洞代码: ...
- linux基础的基础命令操作
一.开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 操作:su - root 二.使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 操作:ctrl ...
- 编辑器KindEditor的使用
1.具体使用方法看点这里 2.下载点这里 3.文件夹说明 ├── asp asp示例,删掉 ├── asp.net asp.net示例,删掉 ├── attached 空文件夹,放置关联文件attac ...
- python 学习笔记 aiohttp
asyncio可以实现单进程并发IO操作,如果仅用在客户端,发挥的威力并不大,如果把asyncio用在服务器端,由于http链接就是IO操作, 因此可以用单线程+coroutine实现多客户的高并发支 ...
- measure time program
#include <time.h> int delay(int time) { int i,j; for(i =0;i<time;i++) for(j=0;j<10000;j+ ...
- linux shell 脚本实现tcp/upd协议通讯(重定向应用)
linux shell 脚本实现tcp/upd协议通讯(重定向应用) http://www.cnblogs.com/chengmo/archive/2010/10/22/1858302.html
- css3 不常用但重要的属性
IOS 2.-webkit-touch-callout (ios 2.0+) none:禁止弹出系统弹窗 default:默认 Android Common 1.-webkit-user-select ...