Цзичжун 10 Т1 2313. Динамический кактус

Цзичжун 10, 2313. Динамический кактус 

(Файл ввод-вывод): вход: dinosaur.in выход: dinosaur.out

Ограничение по времени:  1500 MS пространственные ограничения:  524288 KB конкретные ограничения  

Goto ПарсерКонтест

Название Описание

Песчаная скульптура Во всяком случае, я не играла в игре ...... ......

запись

экспорт

ввод пробы

Ограничение диапазона данных

Решение

Я думаю, что экзамен является правильным

Почему не делится?

Первый взгляд на кактус Несколько ситуаций

situation1

Сравнение двух отдельных кактуса ......

В соответствии с таким небольшим динозавром ходу (прыжок), и никакой специальной операции. На этот раз, максимальная высота составляет два кактусов высокого уровня.

situation2

Еще два последних Cactus полагаться на ......

Первый взгляд, как можно в высоту порядка, конечно, выбрать выпас прыгнул

 

Но динозавр может только падать танцевал ...... Если это танец через первый на посадку, снова взлет, будет установлен на второй кактус!

Так что это только один раз пропустить два кактуса ......

В поисках высшей точки:

Установка первой высоты, второе расстояние между высотой, B, C два;

пунктуация

Решение:

Так как △ ABC равнобедренный прямоугольный треугольник

Поэтому AD = DC = а

Точно так же доступны:

EG = FG = Ь

Поэтому AF = AD + DG + GF = а + B + C

Расширение AB, EF пересекаются в точке H

Также равнобедренный прямоугольный треугольник △ AHF

Поэтому АН = КВ = АФ / 2 = (A + B + C) / 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