Jizhong 10、2313ダイナミックサボテン
(ファイルIO):入力:dinosaur.in出力:dinosaur.out
制限時間:
1500のMSのスペースの制約: 524288キロバイト特定の制限
タイトル説明
砂の彫刻は、とにかく、私はゲームをプレイしていない...... ......
エントリー
輸出
サンプル入力
データ範囲の制限
溶液
私は試験が正しいと思います
なぜ分割されていませんか?
サボテンのいくつかの状況ではまず見て
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; }