UVA 1520--Flights

题意:n个导弹,给出起点和抛物线最高点。给出m架飞机的飞行时的在飞行的导弹和飞行区间,求每架飞机会被摧毁的最大上界

思路:由导弹的起点和最高点,可以求出导弹的飞行方程,然后对于每架飞机,分析对于每个导弹的最小高度,取最大。详细见代码
感想:本来感觉会超时的,但是看看时间,数据量还是挺水的。。
代码:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int mx=500010;
int n,m,k;
double max(double x,double y){if(x>y)return x;return y;}
double min(double x,double y){if(x<y)return x;return y;}
struct node{
    double x,y;///最高点坐标
    double p;///起点
    double a,b,c;///二次方程的系数
}dd[mx];
double ans[mx],tmp,cnt;
int main()
{
    int flag;
    int T=0;
    while(cin>>n)
    {
     if(T) puts("");///控制空行
     T=1;
     for(int i=1;i<=n;i++)
     {
         cin>>dd[i].p>>dd[i].x>>dd[i].y;///解方程求系数
         tmp=dd[i].y/(dd[i].x*dd[i].x+dd[i].p*dd[i].p-2*dd[i].x*dd[i].p);
         dd[i].a=-tmp;
         dd[i].b=2*dd[i].x*tmp;
         dd[i].c=dd[i].y-dd[i].x*dd[i].x*tmp;
     }
     cin>>m;
     int mm=m;
     memset(ans,0,sizeof(ans));
     int ii,jj;
     double xx,yy;
     int t=0;
     while(mm--)
     {
         t++;
         cin>>ii>>jj>>xx>>yy;
        for(int i=ii;i<=jj;i++)///对[ii,jj]每个导弹求[xx,yy]的最大值取最大
        {
            double l=dd[i].p,r=2*dd[i].x-dd[i].p;
            if(xx>r||yy<l) continue;
            if(dd[i].x>=xx&&dd[i].x<=yy)///分三种区间与导弹的位置关系
            {
                ans[t]=max(ans[t],dd[i].y);
                continue;
            }
            if(dd[i].x>yy)
            {
                tmp=dd[i].a*yy*yy+dd[i].b*yy+dd[i].c;
                ans[t]=max(ans[t],tmp);
            }
            if(dd[i].x<xx)
            {
                tmp=dd[i].a*xx*xx+dd[i].b*xx+dd[i].c;
                ans[t]=max(ans[t],tmp);
            }
        }
     }
     for(int i=1;i<=m;i++)
     cout<<fixed<<setprecision(9)<<ans[i]<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值