1424:例题3喷水装置
Posted xiaoyezi-wink
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1424:例题3喷水装置相关的知识,希望对你有一定的参考价值。
1424:【例题3】喷水装置
题解
所以就可以吧这些圆简化为线段
思路
①读入数据,并计算 a[cnt].s =p -sqrt((r*r)-(w/2.0)*(w/2.0));
a[cnt].e =p +sqrt((r*r)-(w/2.0)*(w/2.0));
②按S[i].s进行从小到大快排
③从左到右依次处理每个区间
代码
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; int T; int n,l,w,r,p,cnt; struct app double s,e; a[20015]; bool cmp(app x,app y) return x.s <y.s ; void read() cnt=0; scanf("%d%d%d",&n,&l,&w); for(int i=1;i<=n;i++) scanf("%d%d",&p ,&r ); if(r<=w/2) continue; //直径无法完成w,没有用,直接不计入读入 cnt++; a[cnt].s =p -sqrt((r*r)-(w*w/4.0)); a[cnt].e =p +sqrt((r*r)-(w*w/4.0)); void solve() int ans=0; int i=1; bool flag=1; double t=0; while(t<l) ans++; double s=t; for(;a[i].s <=s&&i<=cnt ; i++) //依次找能够覆盖L点的最大右端点 if(t<a[i].e ) t=a[i].e ; if(t==s&&s<l) //中间有断层,且未到达终点,判断无解 flag=0; printf("-1\\n"); break; if(flag) printf("%d\\n",ans); int main() scanf("%d",&T); while(T--) read(); sort(a+1,a+cnt+1,cmp); solve(); return 0;
以上是关于1424:例题3喷水装置的主要内容,如果未能解决你的问题,请参考以下文章