スリーポイントアルゴリズム


地上牛肉一族の試合

タイトル説明

国の多くは訓練基地を確立するように、牛肉一族はしばしば離れて、一致しているため、各基地は(x、y)は(x、y)の座標(x、y)を持っています。

この週末、牡牛座のチームは、シャフトxxxは各ゲームでのマッチ、マッチポイントを出て行かなければなりません。レースの場として最大値と最小距離に到達するために訓練基地を探しているゲームの便宜のために牡牛座のチームは、。

牡牛座のチームの問題は単純すぎる、それはあなた次第です、あなたは彼がカウントを支援する〜

説明を入力します。

 

入力データの最初の行は、整数N(1≤N≤100000)N含有(100当量N当量1を\ \ \、000)N(1≤N≤100000)、チーム訓練基地牛肉図の数。

次NNN行222個の整数を含む各行は、X、Y(-10000≤x、y≤10000)X、Y(-10 \ 000 \当量X、Y \ 10当量\、000)X、Y (-10000≤x、y≤10000)、それは、各トレーニングベースの座標を表します。

出力説明:

 

出力小数は、訓練基地と一致するように選択されたそれぞれからの最大距離の最小値を表します。

AB | | MAX(1、| B |)≤10-4\ FRAC {| AB |} {MAX(1、| B |)} \当量10もし答えがAAAであれば、標準答えはBBBであり、 ^ - 最大{4}(1、| B |)|-B |≤10-4、あなたが正しいと判断されてお答えします。

例1

エントリー

コピー 3002002

3
0 0
2 0
0 2

輸出

コピー 2

2

説明

当在(0,0)(0,0)比赛时,到三个训练基地的最大距离是22。可以证明这是最小值。

 

来着 儒生雄才1 聚聚发布的std:
#include <bits/stdc++.h>
using namespace std;
 
struct p{
    int x,y;
}a[100005];
int n;
double check(double x)
{
    double max=0;
    for (int i=1;i<=n;i++)
    {
        double tmp=sqrt(a[i].y*a[i].y+(a[i].x-x)*(a[i].x-x));
        if (tmp>max) max=tmp;
    }
    return max;
}
double tsearch(double left,double right){
    int i;
    double mid,midmid;
    for(i=0;i<100;i++){
        mid=left+(right-left)/2;
        midmid=mid+(right-mid)/2;
        if(check(mid)>check(midmid)) //极大值求法
            left=mid;
        else
            right=midmid;
    }
    return mid;
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        scanf("%d%d",&a[i].x,&a[i].y);
    double max=tsearch(-10000,10000);
    printf("%.4lf\n",check(max));
    return 0;
}

曲線#10013.「3を通して1.2例」

エッセイ:式があると思われますか?サーズは徐々に最も価値の点に近づいて、ポイント

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <functional>
/// #include <unordered_map>
/// #include <multimap>
/// #include <multiset>
#include <map>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <utility>
#include <cstring>
using namespace std;
#define PI acos(-1)
#define TLE std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
const ll mod = 1000000007 ;
const int mxn = 1e5+10 ;
ll prime[mxn],isprime[mxn],bit[mxn],a[mxn],b[mxn],c[mxn];
int n,m,t,u,w,l,r,k,x;
string str , s1  ,s2 , s3;
struct node {double x,y,z;}poi[mxn];
double check(double x)
{
    double res = -1e9 ;
    for(int i=1;i<=n;i++)
        res = fmax( res , poi[i].x*x*x+poi[i].y*x+poi[i].z ) ;
    return res ;
}

double slove(double l,double r)
{
    double mid , midmid;
    while(r-l>1e-11)
    {
        mid = l + (r-l)/3;
        midmid = r - (r-l)/3;
        if(check(mid) > check(midmid))
            l = mid ;
        else
            r = midmid ;
    }
    return mid ;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n) ;
        for (int i=1; i<=n; i++)
            scanf("%lf %lf %lf",&poi[i].x,&poi[i].y,&poi[i].z);
        double ans = slove(0,1000);
        printf("%.4lf\n",check(ans));
    }
}

電球#10016.「スルー1.2演習3」

エッセイ:プッシュ同様の台形公式、第三の位置、長さだけがコーナーに達した場合に影の影の縦の長さを増加させること、次いで、前進するとき第三の理由の影の減少したレベル、比較的大きいです

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <functional>
/// #include <unordered_map>
/// #include <multimap>
/// #include <multiset>
#include <map>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <utility>
#include <cstring>
using namespace std;
#define PI acos(-1)
#define TLE std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
const ll mod = 1000000007 ;
const int mxn = 1e5+10 ;
ll prime[mxn],isprime[mxn],bit[mxn],a[mxn],b[mxn],c[mxn];
int n,m,t,u,w,l,r,k,x;
string str , s1  ,s2 , s3;
double H,D,h ;
double check(double x){return x + (D*h - x*H)/(D-x);}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf %lf %lf",&H,&h,&D) ;
        double l = 0 , r = h/H*D ;
        while(r-l>1e-5)
        {
            double mid = l+(r-l)/3 ,
                   midmid = r-(r-l)/3;
            if(check(mid) > check(midmid))
                r = midmid ;
            else
                l = mid ;
        }
        printf("%.3lf\n",check(l));
    }
}

1857:[Scoi2010】ベルト

説明

二次元平面内の2本のコンベアベルトがあり、各コンベヤベルトは、セグメントとみなすことができます。二つのコンベアベルトは、線分ABとCDです。ABでlxhgww移動速度はP、CDはQ、平面Rの移動速度であるに移動する速度であります 今lxhgww点Dに点Aから行くと、彼は行くためにどのくらいの最低必要性を知りたいと思いました

入力

入力データの最初の行は4の整数であり、それぞれA及びBのグラフ、斧、Ayの、BXは、4つの整数第二の線によって、座標C及びDは、それぞれ、Cxとを表し、Cyの、Dxを、Dyのあります3行目は3の整数であり、P、Q、Rであります

出力

二つの出力データ線の後、それが最小の時間がD点に点Aから行くlxhgww表す、保持小数点

サンプル入力

0 0 0 100
100 0 100 100
2 2 1

 

サンプル出力

136.60

ヒント

データ,. 1 <=の斧、Ayを、BX、により、Cxのは、Cy、Dxを、Dyの<= 1000の100%に
。1 <= P、Q、R&LT <= 10

 

エッセイ:すべてのナレーションと組み合わせるには、AB上の任意の点Fのために、EFでCDに到達するためのFからの最短経路を見つけることができ、その後、AF-FE-EDは、我々は最短経路を必要とするもので、その後、平行でない場合、我々はE点が決定されると仮定することができ、AB列挙上のポイントは、その後、TLEの本は、あなたが考えることができるならば、それはその後、平行である場合には、EFパス時間ができAB、最大のCDの速度を見つける必要がありますポイントは、その後、E ABまでの距離画像は、最低点はそう、最短距離EF OU(出てきませんが、単語をOU再生する方法をアドバイスを求める)機能画像です、私たち三AB、MIDL、MIDRで、その後、別の三分の一のCDは、AB-3番目の出口までの時間-DIS記録時間と最小位置は、その後、再びCD三分の二に、最後の時間が最短であっても、ポイントを見つけます。

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <functional>
/// #include <unordered_map>
/// #include <multimap>
/// #include <multiset>
#include <map>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <utility>
#include <cstring>
using namespace std;
#define PI acos(-1)
#define TLE std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define pb push_back
#define ll long long
#define pii pair<int,int>
#define eps 1e-3
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
const ll mod = 1000000007 ;
const int mxn = 1e5+10 ;
ll prime[mxn],isprime[mxn],bit[mxn],a[mxn],b[mxn],c[mxn];
string str , s1  ,s2 , s3;
int ax,ay,bx,by,cx,cy,dx,dy,p,q,r;
double dis_time(double x1,double y1 , double x2 ,double y2) {return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
double check(double x , double y)
{
    double lx = cx , ly = cy , rx = dx , ry = dy ;
    while(fabs(rx-lx)>eps || fabs(ry-ly)>eps)
    {
        double midlx = lx+(rx-lx)/3 , midly = ly + (ry - ly)/3 ;
        double midrx = rx-(rx-lx)/3 , midry = ry - (ry - ly)/3 ;
        double time_l = dis_time(ax,ay,x,y)/p + dis_time(x,y,midlx,midly)/r+dis_time(midlx,midly,dx,dy)/q ;
        double time_r = dis_time(ax,ay,x,y)/p + dis_time(x,y,midrx,midry)/r+dis_time(midrx,midry,dx,dy)/q ;
        if(time_l > time_r)
            lx = midlx , ly = midly ;
        else
            rx = midrx , ry = midry ;
    }
    return dis_time(ax,ay,x,y)/p + dis_time(x,y,lx,ly)/r+dis_time(lx,ly,dx,dy)/q ;
}
int main()
{
    cin>>ax>>ay>>bx>>by>>cx>>cy>>dx>>dy>>p>>q>>r;
    double lx = ax , ly = ay , rx = bx , ry = by ;
    while(fabs(rx-lx)>eps || fabs(ry-ly)>eps)
    {
        double midlx = lx+(rx-lx)/3 , midly = ly + (ry - ly)/3 ;
        double midrx = rx-(rx-lx)/3 , midry = ry - (ry - ly)/3 ;
        double time_l = check(midlx,midly);
        double time_r = check(midrx,midry);
        if(time_l > time_r)
            lx = midlx , ly = midly ;
        else
            rx = midrx , ry = midry ;
    }
    printf("%.2lf\n",check(lx,ly));
}

 

 

公開された102元の記事 ウォン称賛30 ビュー10000 +

おすすめ

転載: blog.csdn.net/m0_43382549/article/details/104308047