北邮OJ 102. 最远距离 北邮2012网研院复试上机题
来源:互联网 发布:泰国买衣服便宜 知乎 编辑:程序博客网 时间:2024/06/03 18:15
102. 最远距离
题目描述
正义的伙伴褋祈和葬仪社的机器人Fuyuneru正在被邪恶的GHQ部队追杀。眼看着快要逃不掉了,祈就把重要的东西塞到了机器人体内,让它先跑,自己吸引火力。
假设Fuyuneru带上东西开始逃跑时所处的点为原点,朝向为正北。操纵FuyuNeru的指令有如下四种:
right X: X是1-359之间的整数,Fuyuneru的前进方向顺时针转X度。
left X: X是1-359之间的整数,Fuyuneru的前进方向逆时针转X度。
forward X: X是整数(0<=X<=1000),Fuyuneru向当前朝向前进X米。
backward X: X是整数(0<=X<=1000),Fuyuneru向当前朝向后退X米。
现在祈向Fuyuneru体内输入了N(1<=N<=50)个这样的指令。可是由于此前Fuyuneru被GHQ部队击中,它出了一点小问题:这N个指令执行的顺序是不确定的。
问:Fuyuneru最远可能逃出多远?
即,Fuyuneru在执行完N条指令之后,距离原点最远的可能距离是多少?
输入格式
第一行是一个整数T,代表测试数据有T组。
每组测试数据中,第一行是一个整数N,代表指令有N条;
随后紧跟N行,每一行代表一个指令(格式保证是上述四种中的一种,数据保证合法)
输出格式
对于每组数据,输出一行:最远的可能逃亡距离,精确到小数点后3位。
输入样例
33forward 100backward 100left 904left 45forward 100right 45forward 1006left 10forward 40right 30left 10backward 4forward 4
输出样例
141.421200.00040.585
最远距离为,向前走之后,找到一个向后走的时候向前走的方向尽可能处在180°上的方向。
比如,向前走100米,然后向右转180°,然后向后走100米,然后随意旋转,这样就距离起点最远,200米。
所以问题转化为,找到一种旋转组合,使得尽可能旋转180°。
然后利用a^2+b^2-2abcosC=c^2求出最远距离
对于求出旋转角度组合,设向右为正,假设输入顺序:60°,30°,10°,等等
我们读入60°的时候,从(0+60°)-(360°+60°)开始枚举,首先标记60°为访问过,vis[60]=1,即我们可以旋转出60°这个角度来,然后访问余下的角度,如果访问过x°,if(vis[x]==1),那么我们标记x+60°为也访问过,即x+60°这个角度也是可以被访问到的,vis[x+60]=1。
比如,当我们按顺序第二个读入30°的时候,vis[30]=1,在(0+60°)-(360°+60°)枚举的过程中,枚举到30°+30°的时候,因为vis[30+30]==1,所以,vis[60+30]=1。
然后我们只要不断更新,最接近180的vis[],然后计算即可。
#include<iostream>#include<algorithm>#include<cstring>#include<cstdlib>#include<cstdio>#include<cmath>#include<set>#define Pi acos(-1.0)using namespace std;double dis(double a,double b,double Ang) { return sqrt(a*a+b*b-2*a*b*cos(Ang/180*Pi));}int main() { int i,j,t,n,vis[360],val,minA,rec[360];//minA是和180°最接近的角度,vis用来记录是否可以到达该角度,rec用来记录当前角度是否被使用过 multiset<int>turn; //来存旋转角度,向右为正 int up,down; //前进和后退 string s; for(cin>>t;t--;){ turn.clear(); up=down=0; memset(vis,0,sizeof vis); for(cin>>n;n--;){ cin>>s>>val; if(s=="forward")up+=val; else if(s=="backward")down+=val; else{ if(s=="right")turn.insert(val); else turn.insert(360-val); } } multiset<int>::iterator it; vis[0]=1; for(it=turn.begin();it!=turn.end();it++){ //printf("it:%d\n",*it); memset(rec,0,sizeof rec); for(i=0;i<360;i++){ int tmp=(i+*it)%360; if(rec[i]==0&&(vis[i])&&vis[tmp]==0){ vis[tmp]=rec[tmp]=1; } } } minA=180; //防止没有旋转指令 for(i=0;i<360;i++) if(vis[i]) if(abs(180-i)<minA) minA=abs(180-i); //printf("minA:%d\n",minA); printf("%.3lf\n",dis(up,down,180-minA)); } return 0;}
- 北邮OJ 102. 最远距离 北邮2012网研院复试上机题
- 北邮2012年复试上机题目
- 2012北京邮电复试上机题
- 2012年北理复试上机题
- 2012浙大复试上机题Helloworld
- 北邮OJ-94. 最小距离查询-13计院上机D
- 最远距离
- 最远距离
- 最远距离
- 最远距离
- 最远距离
- 华科软院部分复试上机题
- 2014年北理复试上机题
- 2013年北理复试上机题
- 2011年北理复试上机题
- 2010年北理复试上机题
- 2009年北理复试上机题
- 2008年北理复试上机题
- Java数组操作的10大方法,大部分代码都来自Stack Overflow。
- 李丰杰老师 实战生产管理专家
- 子字符串查找算法_归纳及汇总
- 深复制浅复制
- ft难点记录
- 北邮OJ 102. 最远距离 北邮2012网研院复试上机题
- 几种简单的排序
- TCP/IP
- 从Storm学习集群管理
- 模板模式(7)
- MySQL查询:查询一个表中类别字段中Max()最大值对应的记录
- Struts2从一个action转到另一个action的两种方法
- phpstorm小总结
- ft上线蛋疼问题