三分题目

zoj 3203

题意:求人从左到右走影子的最大长度L。

设人离开灯的长度为x,当灯、人的头顶和墙角在一条直线上时(此时人在A点),影子全部投在地上,此时x = (H-h)*D/H;当人继续向前走,一部分影子就会投在墙上,当人走到最右边,影子长度即为人的高度。所以从A点到墙角,人的影子长度先增大后减小,是一个凸性函数。根据两个相似三角形把L表示成x的函数L= D+H-x-(H-h)*D/x,然后三分求解最大值。

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#define LL long long
#define _LL __int64
#define eps 1e-9

using namespace std;

double H,h,D;
double cal(double mid)
{
    return D+H-mid-(H-h)*D/mid;
}

double solve(double low, double high)
{
    while(high - low > eps)
    {
        double mid = (low + high) / 2.0;
        double midmid = (mid + high) / 2.0;

        double ans1 = cal(mid);
        double ans2 = cal(midmid);
        if(ans1 < ans2)
            low = mid;
        else high = midmid;
    }
    return low;
}

int main()
{
    int test;
    scanf("%d",&test);
    while(test--)
    {
        scanf("%lf %lf %lf",&H,&h,&D);
        double ans = solve((H-h)*D/H,D);
        printf("%.3lf\n",cal(ans));
    }
    return 0;
}

hdu 4355

题意很简单,求出一个点x使其他所有点与该点的距离差s^3*wi最小。

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#define LL long long
#define _LL __int64
#define eps 1e-8
#define PI acos(-1.0)

using namespace std;
const int INF = 0x3f3f3f3f;

struct node
{
    double x;
    double w;
}p[50010];
int n;

double cal(double x)
{
    double ans = 0;
    for(int i = 0; i < n; i++)
    {
        double tmp = fabs(p[i].x - x);
        ans += tmp * tmp * tmp * p[i].w;
    }
    return ans;
}

double solve(double low, double high)
{
    double ans1,ans2;
    while(high - low > eps)
    {
        double mid = (low+high)/2.0;
        double midmid = (mid + high)/2.0;

         ans1 = cal(mid);
         ans2 = cal(midmid);

        if(ans1 < ans2)
            high = midmid;
        else
            low = mid;
    }
    return low;
}

int main()
{
    int test;
    scanf("%d",&test);
    double low, high;

    for(int item = 1; item <= test; item++)
    {
        scanf("%d",&n);
        low = INF;
        high = -INF;
        for(int i = 0; i < n; i++)
        {
            scanf("%lf %lf",&p[i].x,&p[i].w);
            low = min(low, p[i].x);
            high = max(high,p[i].x);
        }

        double ans = solve(low, high);
        printf("Case #%d: %.0lf\n",item,cal(ans));
    }
    return 0;
}

hdu 2438

题意:给出一个直角弯道,弯道的宽分别为x和y,汽车的长和宽为l和d,问汽车能否通过弯道。

思路:

汽车要通过弯道,其左边要尽量靠着O点,右下角要尽量贴着地面。如图所示,那么在这样的情况下,汽车能通过的条件是右上角Q点到O点所在直线的距离要小于等于路的宽度y。设角度a如图,那么把要求变量表示成角度的函数 f(a) = l*cos(a) -(x - d/cos(a) ) / tan(a) 。即f(a) = l*cos(a) - (x*sin(a)-d)/sin(a)。三分法就f(a)的最大值与y比较。

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#define LL long long
#define _LL __int64
#define eps 1e-8
#define PI acos(-1.0)

using namespace std;
const int INF = 0x3f3f3f3f;

double x,y,l,w;
double cal(double t)
{
     return l*cos(t) + (w-x*cos(t))/sin(t);
}

double solve(double low, double high)
{
    while(high - low > eps)
    {

        double mid= (high - low)/3+low;
        double midmid= (high - low)*2/3+low;

        double ans1 = cal(mid);
        double ans2 = cal(midmid);

        if(ans1 < ans2)
            low = mid;
        else
            high = midmid;
     }
     return low;
}

int main()
{
    while(~scanf("%lf %lf %lf %lf",&x,&y,&l,&w))
    {
        double low = 0;
        double high = acos(-1.0)/2;
        double ans = solve(low, high);

        //printf("%lf\n",ans);

        if(cal(ans) <= y)
            printf("yes\n");
        else printf("no\n");
    }
    return 0;
}

三分题目,布布扣,bubuko.com

时间: 2024-10-05 08:19:20

三分题目的相关文章

【bzoj1857】传送带——三分套三分

我的第一道三分题目. 早上跟着cyc学了一下三分,晚上想练一下手发现没什么水题就找到了这一道2333 主要是证明是一个单峰函数,这也是本题最难的部分(网上好多人写出来但不会证明:)) 证明过程来自yyl dalao: 本题要讨论必使r<max(q,p),否则还要走什么传送带... 从A点出发,要使解最优,必定要走A->E->F->D,其中E是AB上一点,F为CD上一点. 因为E和F都是不确定的,我们不妨假设E点已经确定,那么CD上必定存在一点F使得EF和FD最优(先不考虑AE),那

「专题总结」半平面交(6/8completed)

还是题都没做完就来写一部分题解了,因为最近很忙(其实是效率太低),所以可能一时半会回不来这个专题. 为了防止什么都没剩下忘干净,于是乎瞎写个题解记录一下... 还是一如既往的不擅长集合. 刚开始我看到半平面交我还以为是用来解决三维计算几何问题的,吓一跳. 半平面不用多说,就是一条直线把一个二维平面分成两半,其中的一半. 半平面交其实很好理解,就是同一个二维平面中若干个半平面相交的部分. 维护的方法其实挺草率的,和凸包有不少互通的地方,只不过因为封闭所以是双端队列. 凸包偏向于点,半平面交偏向于线

三分&#183;三分求极值 算法讲解和题目

题目: #1142 : 三分·三分求极值 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d. 提示:三分法 输入 第1行:5个整数a,b,c,x,y.前三个数构成抛物线的参数,后两个数x,y表示P点坐标.-200≤a,b,c,x,y≤200 输出 第1行:1个实数d,保留3位小数(四舍五入) 样例输入 2 8 2 -2 6 样例输出 2

hiho一下 第四十周 题目1 : 三分&#183;三分求极值

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 这一次我们就简单一点了,题目在此: 在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d. 提示:三分法 × 提示:三分法 在之前的几周中我们了解到二分法作为分治中最常见的方法,适用于单调函数,逼近求解某点的值. 但当函数是凸形函数时,二分法就无法适用,这时就需要用到三分法. 从三分法的名字中我们可以猜到,三分法是对于需要逼近的区间做三等分: 我们发现lm这个点比rm要低,那

POJ 题目3305Surveillance(数学几何,三分)

Surveillance Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 274   Accepted: 92 Description See.Eye.A, the world's biggest independent intelligence agency, is located in a very large underground building. Recently, due to the large amoun

hdu 4717 The Moving Points(三分)

题目链接:hdu 4717 The Moving Points 题意: 在二维平面上有n个点,每个点给出移动的方向和速度. 问在某个时刻,这些点中最大距离最小是多少,输出时刻和距离. 题解: 我们可以知道,每个点对的距离要么是单调递增,要么是有一个峰的函数. 举例画一下可知道合成的这个函数最多只有一个峰,所以可以用三分求解. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespa

三分算法

三分算法 二分算法解决的是具有单调性的问题. 三分算法解决的是抛物线的类型,上凸,下凹. mid=(Left+Right)/2; midmid=(Right+mid)/2; 题目类型有: HDU :3400  2298  4454  2438  3756 POJ:  3301   3737 ZOJ: 3203

Toxophily-数论以及二分三分

G - Toxophily Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2298 Description The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and bridge, toxophily, deluxe ballroom

HDU 2438 Turn the corner (计算几何 + 三分)

Turn the corner Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2059    Accepted Submission(s): 785 Problem Description Mr. West bought a new car! So he is travelling around the city. One day h