题意: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;
}