纪中10日T1 2313. 动态仙人掌

Posted send-off-a-friend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了纪中10日T1 2313. 动态仙人掌相关的知识,希望对你有一定的参考价值。

纪中10日 2313. 动态仙人掌 

(File IO): input:dinosaur.in output:dinosaur.out

时间限制: 1500 ms  空间限制: 524288 KB  具体限制  

Goto ProblemSet

题目描述

技术图片

沙雕游戏……反正我没玩过……

输入

技术图片

输出

技术图片

样例输入

技术图片

数据范围限制

技术图片

Solution

考试时想的是对的

为什么就是没有分呢?

首先看看仙人掌有几种情况

situation1

技术图片

两个比较分开的仙人掌……

技术图片

小恐龙按照这样走(跳),并没有什么特殊操作。这时的最高高度是两个仙人掌中最高的高度。

situation2

技术图片

两个靠的比较近的仙人掌……

技术图片

先看第一个,为了高度尽量小,当然选择擦边跳了

 技术图片

但是恐龙只有落地才能跳呀……要是它跳完第一个就落地,再起跳,一定会装上第二个仙人掌的!

技术图片

所以它只能一次性的跳过两个仙人掌……

求最高点:

设第一个的高度为a,第二个的高度为b,两个之间的距离为c;

技术图片

标点

技术图片

解:

因为△ABC是直角等腰三角形

所以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

那么就可以把两个仙人掌合成一个更高的了

Code

#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;

 

以上是关于纪中10日T1 2313. 动态仙人掌的主要内容,如果未能解决你的问题,请参考以下文章

纪中第十四天

纪中10日T1 2300. noip普及组第一题模板题

习题汇总

[考试反思]0521省选模拟102:印象

纪中17日T1 2321. 方程

纪中5日T1 1564. 旅游