Hdu 4454 Stealing a Cake(枚举或三分)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4454

思路:枚举角度,确定圆上点的位置,取最小值。

点到矩形最短距离:若点在矩形边所表示的范围内,则到矩形最短距离为x或y坐标到矩形边的距离。否则为点到矩形顶点的距离。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debu
using namespace std;
const double pi=acos(-1.0);
struct Point
{
    double x,y,r;
};
Point C,P,st;
double x1,y1,x2,y2;
double miny,maxy,minx,maxx;
double dist(Point a,Point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double Rdist(Point a)
{
    double x=0.0,y=0.0;
    if(a.x<minx) x=minx-a.x;
    else if(a.x>maxx) x=a.x-maxx;
    if(a.y<miny) y=miny-a.y;
    else if(a.y>maxy) y=a.y-maxy;
    return sqrt(x*x+y*y);
}
int main()
{
#ifdef debug
    freopen("in.in","r",stdin);
#endif // debug
    while(scanf("%lf%lf",&st.x,&st.y)!=EOF)
    {
        if(st.x==0&&st.y==0) break;
        double ans=1e10;
        scanf("%lf%lf%lf",&C.x,&C.y,&C.r);
        scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
        minx=min(x1,x2),maxx=max(x1,x2);
        miny=min(y1,y2),maxy=max(y1,y2);
        for(double rad=0; rad<=360; rad+=0.005)
        {
            Point P;
            P.x=C.x+C.r*cos(rad/180*pi);
            P.y=C.y+C.r*sin(rad/180*pi);
            ans=min(ans,dist(P,st)+Rdist(P));
        }
        printf("%.2f\n",ans);
    }
    return 0;
}
时间: 2024-10-10 22:35:05

Hdu 4454 Stealing a Cake(枚举或三分)的相关文章

HDU 4454 Stealing a Cake --枚举

题意: 给一个点,一个圆,一个矩形, 求一条折线,从点出发,到圆,再到矩形的最短距离. 解法: 因为答案要求输出两位小数即可,精确度要求不是很高,于是可以试着爆一发,暴力角度得到圆上的点,然后求个距离,求点到矩形的距离就是求点到四边的距离然后求个最小值,然后总的取个最小值即可. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include &l

hdu 4454 Stealing a Cake(三分)

题目链接:hdu 4454 Stealing a Cake 题目大意:给定一个起始点s,一个圆形,一个矩形.现在从起点开始,移动到圆形再移动到矩形,求最短距离. 解题思路:在圆周上三分即可.即对角度[0,2*pi]三分,计算点和矩形的距离可以选点和矩形四条边的距离最短值. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std

HDU 4454 Stealing a Cake(三分暴力枚举)

题目大意:给你一个点,一个圆,一个矩形让你求出来,点到圆然后再到矩形的距离.圆和矩形你可以认为是可以穿过的. 解题思路:三分枚举点到圆的位置,然后求出来总长度,找到一个最小的长度.枚举点的坐标的时候可以枚举角度,也可以枚举坐标.总长度等于点到圆上的点的距离加上圆上的点到矩形四个线段的最小距离的和. PS:输出%0.2lf所以精度要求不高,自我感觉枚举角度会更保证精度. Stealing a Cake Time Limit: 5000/2000 MS (Java/Others)    Memory

HDOJ 4454 Stealing a Cake 计算几何

暴力枚举角度..... Stealing a Cake Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2495    Accepted Submission(s): 681 Problem Description There is a big round cake on the ground. A small ant plans to

HDU 4771 Stealing Harry Potter&#39;s Precious (生成排列+枚举 + BFS)

Stealing Harry Potter's Precious Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1982    Accepted Submission(s): 931 Problem Description Harry Potter has some precious. For example, his invisib

HDU 4771 Stealing Harry Potter&#39;s Precious

http://acm.hdu.edu.cn/showproblem.php?pid=4771 题意: 给定一副NxM的地图, '#'不可走, '.'可走, '@'为起点 再给出K个(0<K<=4)宝藏点 问从起点开始,走过所有宝藏点的最小步数 若有宝藏点不能到达则输出-1 解法: bfs(最小步数) + dfs(顺序) bfs预处理,先从起点开始,若有点无法到达直接输出-1 再枚举宝藏点作为起点求出每两点间的最小步数,存入数组中(step[i][j]表示从i点到j点的最小步数) 最后dfs枚举

hdu 4430 Yukari&#39;s Birthday 枚举+二分

注意会超long long 开i次根号方法,te=(ll)pow(n,1.0/i); Yukari's Birthday Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3262    Accepted Submission(s): 695 Problem Description Today is Yukari's n-th birt

【HDU 4771 Stealing Harry Potter&#39;s Precious】BFS+状压

2013杭州区域赛现场赛二水... 类似“胜利大逃亡”的搜索问题,有若干个宝藏分布在不同位置,问从起点遍历过所有k个宝藏的最短时间. 思路就是,从起点出发,搜索到最近的一个宝藏,然后以这个位置为起点,搜索下一个最近的宝藏,直至找到全部k个宝藏.有点贪心的感觉. 由于求最短时间,BFS更快捷,但耗内存,这道题就卡在这里了... 这里记录了我几次剪枝的历史...题目要求内存上限32768KB,就差最后600KB了...但我从理论上觉得已经不能再剪了,留下的结点都是盲目式搜索必然要访问的结点. 在此贴

Hdu 4771 Stealing Harry Potter&#39;s Precious (搜索)

题目大意: 地图上有最多4件物品,小偷要全部拿走,问最少的路程. 思路分析: 考虑到物品数量只有4. 可以先用最多5次bfs求出每个目标点到其他目标点的距离. 然后枚举依次拿取物品的顺序,用next_permutation... #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <queue> using namespace