2012.网研院.Problem D.最远距离

傷城~ 2023-07-22 03:43 51阅读 0赞

题目描述
正义的伙伴褋祈和葬仪社的机器人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位。

输入样例

  1. 3
  2. 3
  3. forward 100
  4. backward 100
  5. left 90
  6. 4
  7. left 45
  8. forward 100
  9. right 45
  10. forward 100
  11. 6
  12. left 10
  13. forward 40
  14. right 30
  15. left 10
  16. backward 4
  17. forward 4

输出样例

  1. 141.421
  2. 200.000
  3. 40.585

最远距离为,向前走之后,找到一个向后走的时候向前走的方向尽可能处在180°上的方向。
比如,向前走100米,然后向右转180°,然后向后走100米,然后随意旋转,这样就距离起点最远,200米。
所以问题转化为,找到一种旋转组合,使得尽可能旋转180°。
然后利用a2 +b2 -2abcosC=c2求出最远距离

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const double Pi = acos(-1.0);
  4. int min(int a,int b) {
  5. return a<b?a:b;
  6. }
  7. int main() {
  8. int t,n,x;
  9. string op;
  10. double ans;
  11. cin>>t;
  12. while(t--) {
  13. vector<int> ang;//记录角度
  14. int vis[360],dp[360];//访问标记
  15. cin>>n;
  16. int a=0,b=0;
  17. for(int i=0; i<n; i++) {
  18. cin>>op>>x;
  19. if(op=="forward") {
  20. a+=x;
  21. } else if(op=="backward") {
  22. b+=x;
  23. } else if(op=="right") {
  24. ang.push_back(x);
  25. } else if(op=="left") {
  26. ang.push_back(360-x);
  27. }
  28. }
  29. memset(vis,0,sizeof(vis));
  30. vis[0]=1;//0度
  31. int len=ang.size();
  32. int min_value=180;
  33. for(int j=0; j<len; j++) {
  34. memset(dp,0,sizeof(dp));
  35. for(int i=0; i<360; i++) {
  36. int temp=(i+ang[j])%360;
  37. if(vis[i]&&dp[i]==0&&vis[temp]==0) {
  38. vis[temp]=1;
  39. dp[temp]=1;
  40. min_value=min(min_value,abs(180-temp));
  41. }
  42. }
  43. }
  44. //a^2+b^2-2abcosC=c^2求出最远距离
  45. double angle=(180-(double)min_value)*Pi/180;
  46. ans=sqrt((double)a*(double)a+(double)b*(double)b-2*(double)a*(double)b*cos(angle));
  47. printf("%.3lf\n",ans);
  48. }
  49. }

发表评论

表情:
评论列表 (有 0 条评论,51人围观)

还没有评论,来说两句吧...

相关阅读

    相关 2012..Problem D.距离

    题目描述 正义的伙伴褋祈和葬仪社的机器人Fuyuneru正在被邪恶的GHQ部队追杀。眼看着快要逃不掉了,祈就把重要的东西塞到了机器人体内,让它先跑,自己吸引火力。 假设F

    相关 2014..Problem B. 小堆

    题目描述 给定一棵带权二叉树,请判断它是不是一个最小堆。 一棵二叉树是一个最小堆,当且仅当对于树上任意一个节点,它的权值都小于或等于以它为根的子树中的所有权值。 输入

    相关 2014..Problem D. 网络传输

    题目描述 网络的高效互联与智能传输是提升海量用户服务请求映射效率的重要措施。在这个任务中,你要用最少的传输时间,将特定的数据源发送到指定的网络节点中。 我么给定的网络一