Jizhong 10 T1 2313ダイナミックサボテン

Jizhong 10、2313ダイナミックサボテン 

(ファイルIO):入力:dinosaur.in出力:dinosaur.out

制限時間:  1500のMSのスペースの制約:  524288キロバイト特定の制限  

後藤ProblemSet

タイトル説明

砂の彫刻は、とにかく、私はゲームをプレイしていない...... ......

エントリー

輸出

サンプル入力

データ範囲の制限

溶液

私は試験が正しいと思います

なぜ分割されていませんか?

サボテンのいくつかの状況ではまず見て

situation1

二つの別々のサボテンの比較......

このような小さな恐竜、外出先(ジャンプ)、および特別な動作によれば。この時間は、最大高さが2つのサボテン最高レベルです。

situation2

さらに二つの最近のサボテンに依存している......

もちろん、放牧を選択し、受注高さができるだけ小さく最初の外観は、飛び降り

 

しかし、恐竜が踊っただけ落ちることができます......それが着陸に第1貫通踊る場合は、離陸再び、二サボテンにインストールされます!

だから、一度だけ2つのサボテンをスキップする......

最高点を探しています:

2つのCの最初の高さ、高さ、Bとの間の第2の距離を設定します。

句読

ソリューション:

ABCが直角2等辺三角形である△ので、

したがって、AD = DCは、A =

同様にご利用いただけます:

EG = FG = B

したがって、AF = AD + DG + GF = A + B + C

拡張AB、EFは、H点で交わります

AHF△また等辺直角三角形

したがって、AH = HF = AF / 2 =(A + B + C)/ 2

だから我々は高いの一つに2つのサボテンを置くことができます

コード

#include<iostream>//不想OI一场空,千万别用万能头
#include<algorithm>//快排sort()
#include<cstdio>//能不用cin就不用
#include<cstring>
#include<map>
#include<vector>
#define IL inline
using namespace std;
IL void fin(){freopen("dinosaur.in","r",stdin);}
IL void fout(){freopen("dinosaur.out","w",stdout);}
IL void fio()
{
    fin();
    fout();
}

struct node{
    double p;
    double h;
}din[100000];
bool cmp(node ta,node tb)
{
    return ta.p<tb.p;
}
int n,tp,th,maxn;
double ans=-1;
int main()
{
//    fio();
    cin>>n;
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&tp,&th);
        din[i].p=tp;
        din[i].h=th;
        ans=max(ans,(double)din[i].h);
        if(din[i].p-din[i].h<0){
            cout<<"-1\n";
            return 0;
        }
    }
    sort(din,din+n,cmp);
    int a,b,c;
    for(int i=0;i<n-1;i++)
    {
        c=din[i+1].p+din[i].p;
        a=din[i].h;
        b=din[i+1].h; 
        if(c>=a+b)
        {
            ans=max(ans,(double)max(a,b));
        }
        else
        {
            ans=max(ans,(a+b+c)/2.0);
            din[i+1].p=(a+din[i].p+din[i+1].p-b)/2.0;
            din[i+1].h=(a+b+c)/2.0;
        } 
    }
    printf("%.1lf",ans);
    return 0;
}

 

Code std

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct cly
{
    int longn,left,right;
}a[300100];
double ans;
int n,p[300100],h[300100],l,r,i;
bool cmd(cly x,cly y)
{
    return x.left<y.left;
}
int main()
{
//    freopen("dinosaur.in","r",stdin);
//    freopen("dinosaur.out","w",stdout);
    cin>>n;
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",p+i,h+i);
        a[i]=(cly){h[i],p[i]-h[i],p[i]+h[i]};
    }
    sort(a+1,a+1+n,cmd);
    if(a[1].left<0)
    {
        cout<<"-1";
        return 0;
    }
    l=a[1].left;
    r=a[1].right;
    i=1;
    while(i<n)
    {
        if(r<=a[i+1].left)
        {
            ans=max(ans,1.0*(r-l)/2);
            i++;
            l=a[i].left;
            r=a[i].right;
        }
        else if(r>=a[i+1].right)
        {
            i++;
        }
        else
        {
            i++;
            r=a[i].right;
        }
    }
    ans=max(ans,1.0*(r-l)/2);
    printf("%.1lf",ans);
    return 0;
}

 

おすすめ

転載: www.cnblogs.com/send-off-a-friend/p/11359021.html