HDU 5515 (ACM 2015 沈阳) Game of Flying Circus [贪心+二分]
2015-10-31 21:17
337 查看
题意:两个人玩一个游戏,他们站在一个矩形的一角,矩形的每条边为300米,每个角被标为1,2,3,4,(他们一开始在1号位置),他们要依此跑过2,3,4,回到1,每个角先到的人会得到1分(当然最初的时候1号点是不算的,要转一圈回来先到的得分),其中一个人跑的很快(记作Speeder),能以V2速度跑,所以他必定直接按路线跑,即沿着矩形边框跑,但是另一个人跑的满,为V1的速度(V1<=V2),但是他很擅长打架(Fighter),能再跑的途中与Speeder战斗,并必定打败S,得到1分,且S会被晕T秒,问你最后F会赢不,输出Yes/No。
范围:所有数小于2000
解法:很明显, F要赢必定要打架,所以除了打架拿到的一分外,他还要至少获得2分才行,那么他可以选择的狙击策略(打晕Speeder!)必然是在最上的那条边或者最右的那条边,同时可以发现越早打晕越好(因为F要重新跑到2号点开始,因为他为了狙击S肯定不会先到2号点),然后枚举S剩下没跑的点谁先到,计算得分比一比就好啦。
求解时间的时候可以选择二分,精度比较高。(有人似乎因为解方程精度丢失WA了)
代码:
范围:所有数小于2000
解法:很明显, F要赢必定要打架,所以除了打架拿到的一分外,他还要至少获得2分才行,那么他可以选择的狙击策略(打晕Speeder!)必然是在最上的那条边或者最右的那条边,同时可以发现越早打晕越好(因为F要重新跑到2号点开始,因为他为了狙击S肯定不会先到2号点),然后枚举S剩下没跑的点谁先到,计算得分比一比就好啦。
求解时间的时候可以选择二分,精度比较高。(有人似乎因为解方程精度丢失WA了)
代码:
#include<stdio.h> #include<string.h> #include<algorithm> #include<math.h> #include<iostream> #include<stdlib.h> #include<set> #include<map> #include<queue> #include<vector> #include<bitset> #pragma comment(linker, "/STACK:1024000000,1024000000") template <class T> bool scanff(T &ret){ //Faster Input char c; int sgn; T bit=0.1; if(c=getchar(),c==EOF) return 0; while(c!='-'&&c!='.'&&(c<'0'||c>'9')) c=getchar(); sgn=(c=='-')?-1:1; ret=(c=='-')?0:(c-'0'); while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0'); if(c==' '||c=='\n'){ ret*=sgn; return 1; } while(c=getchar(),c>='0'&&c<='9') ret+=(c-'0')*bit,bit/=10; ret*=sgn; return 1; } #define inf 1073741823 #define llinf 4611686018427387903LL #define PI acos(-1.0) #define lth (th<<1) #define rth (th<<1|1) #define rep(i,a,b) for(int i=int(a);i<=int(b);i++) #define drep(i,a,b) for(int i=int(a);i>=int(b);i--) #define gson(i,root) for(int i=ptx[root];~i;i=ed[i].next) #define tdata int testnum;scanff(testnum);for(int cas=1;cas<=testnum;cas++) #define mem(x,val) memset(x,val,sizeof(x)) #define mkp(a,b) make_pair(a,b) #define findx(x) lower_bound(b+1,b+1+bn,x)-b #define pb(x) push_back(x) using namespace std; typedef long long ll; typedef pair<int,int> pii; double eps=1e-7; int main(){ tdata{ double T,v1,v2,t,l,r,x,y,t1,t2; scanf("%lf%lf%lf",&T,&v1,&v2); printf("Case #%d: ",cas); //最上边 t1=300.0/v2; t2=600.0/v2; l=t1; r=t2; t=(300.0*sqrt(2.0))/v1; if(t<r){ rep(i,1,200){ double m=(l+r)/2.0; if((m*v1)*(m*v1)>(300.0*300.0+(m-t1)*v2*(m-t1)*v2))r=m; else l=m; } x=sqrt((l*v1)*(l*v1)-300.0*300.0); y=300.0; t=x/v1; int cot1=1; int cot2=1; rep(i,2,4){ t1=(double(i-1)*300.0)/v1+t+l; t2=(double(i)*300.0)/v2+T; if(t1<t2+eps)cot1++; else cot2++; } if(cot1>cot2){ printf("Yes\n"); continue; } } //最右边 t1=600.0/v2; t2=900.0/v2; l=t1; r=t2; t=300.0/v1; if(t<r){ rep(i,1,200){ double m=(l+r)/2.0; if((m*v1)*(m*v1)>(300.0*300.0+(t2-m)*v2*(t2-m)*v2))r=m; else l=m; } y=min(sqrt((l*v1)*(l*v1)-300.0*300.0),300.0); x=300.0; t=sqrt(300.0*300.0+(300.0-y)*(300.0-y))/v1; int cot1=1; int cot2=2; rep(i,3,4){ t1=(double(i-1)*300.0)/v1+t+l; t2=(double(i)*300.0)/v2+T; //printf("%lf %lf\n",t1,t2); if(t1<t2+eps)cot1++; else cot2++; } if(cot1>cot2){ printf("Yes\n"); continue; } } printf("No\n"); } return 0; }
相关文章推荐
- android开发关于和使用本机内存、内置存储卡和外置存储卡 (转)
- 10/100与10/100.0在程序里面运行结果是不一样的,前者是0,后者是0.1
- 说说我对 GCD dispatch_semaphore_t
- Java学习图形界面+网络编程案例---------网络简易通讯
- Divided Product
- java http 发请求,结果转jsonobject解析
- 去掉word中向下的箭头^l----->^p
- 宏
- OpenGL天空贴图以及反射纹理映射即镜面反射
- 《C++ primer》英文第五版阅读笔记(五)——const
- 字幕制作之压制视频
- 去掉word中向下的箭头^l----->^p
- Android学习之xUtils --- HttpUtils模块
- Jenkins搭建过程中遇到的问题整理记录
- hdoj--2069--Coin Change(动态规划)
- 杭电2802F(N)
- javascript 实现文本框明文转暗码
- hdoj--2069--Coin Change(动态规划)
- 【HDOJ】1508 Alphacode
- 【存档记录】给Spring Boot添加远程调试端口