Jizhong 10, 2313 동적 선인장
(파일 IO) : 입력 : dinosaur.in 출력 : dinosaur.out
시간 제한 :
1500 개 MS 공간 제약 : 524,288킬로바이트 특정 제한
제목 설명
모래 조각 어쨌든, 나는 게임을하지 않은 ... ...
기입
수출
샘플 입력
데이터 범위 제한
해결책
나는 시험 잘 생각
왜 분리되지 않는 이유는 무엇입니까?
선인장 여러 상황에서 첫보기
situation1
두 개의 선인장의 비교 ......
같은 작은 공룡 이동 (점프), 및 특별한 동작에 따르면. 이 시간, 최대 높이 두 선인장 가장 높은 수준이다.
situation2
두 최근 선인장은 ......에 의존
주문 높이 가능한 한 작은 첫 번째 모습은 물론, 방목 뛰어 선택
이 착륙의 첫 번째 통해 춤 경우 그러나 공룡 만 ...... 춤 떨어질 수, 이륙, 다시 두 번째 선인장에 설치됩니다!
그래서 한 번만이 선인장을 건너 뛰려면 ......
가장 높은 포인트를 원하는 상대 :
두개의 C의 제 1 높이, 높이, B 사이의 제 2 거리를 설정하는 단계;
구두
해결 방법 :
ABC가 이등변 삼각형 △ 오른쪽 보낸
따라서 AD는 = DC는 = A
이와 유사하게 사용할 수 :
EG = B = FG
따라서 AF = AD + DG + GF = A + B + C
확장 AB, EF는 H 점에서 교차
AHF △ 또한이 이등변 직각 삼각형
따라서 AH = HF = AF / 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; }