Цзичжун 10, 2313. Динамический кактус
(Файл ввод-вывод): вход: dinosaur.in выход: dinosaur.out
Название Описание
Песчаная скульптура Во всяком случае, я не играла в игре ...... ......
запись
экспорт
ввод пробы
Ограничение диапазона данных
Решение
Я думаю, что экзамен является правильным
Почему не делится?
Первый взгляд на кактус Несколько ситуаций
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; }