• SRM538 D1 L2


    Problem Statement

    题目的意思很简单,一只乌龟从起始点A开始,执行N条命令,命令有四种,向左、右转一定的角度,向前、后爬行若干距离,问说如何安排着N条命令,使得最后到达的终点B离A最远,给出这个最远的距离。

    如果命令只有前进和旋转的话,易知不旋转,直接前进到不能前进是最优的,后退同理。

    当有前进和后退同在时,将不在一起的前进的命令都抽取出来从最初的位置开始接起,根据向量相加是不变的,该结果不变,而根据之前提到的,直着连是最优的,所以要直着连,而且直接拿过来的等价情况还可能不能达到(因为包含旋转的角度),但已经不重要了,因为不管如何摆,都没有直着摆要优,同理后退的情况。

    所以处理的方法就是将前进和后退分别捡出来,接起来,枚举可能的旋转就好了。

    #include <iostream>
    #include <string>
    #include <vector>
    #include <sstream>
    #include <cmath>
    using namespace std;
    
    typedef stringstream SS;
    
    const double PI = asin(1.0) * 2;
    
    class TurtleSpy {
    public:
    	bool can[55][360];
    	double maxDistance(vector <string> c) {
    		double f, b;
    		vector<int> d;
    		
    		f = b = 0;
    		
    		for(int i = 0; i < c.size(); i++) {
    			SS s(c[i]);
    			string str;
    			int deg;
    
    			s >> str >> deg;
    			
    			if(str == "forward")  f += deg;
    			else if(str == "backward")  b += deg;
    			else if(str == "left")  d.push_back(deg);
    			else  d.push_back(360 - deg);
    		}
    		
    		memset(can, false, sizeof(can));
    		can[0][0] = true;
    		
    		int n = d.size();
    		for(int i = 0; i < n; i++) {
    			for(int j = 0; j < 360; j++) {
    				if(can[i][j]) {
    					can[i + 1][j] = true;
    					can[i + 1][(j + d[i]) % 360] = true;
    				}
    			}
    		}
    		
    		double res = 0.0;
    		for(int i = 0; i < 360; i++) {
    			if(can[n][i]) {
    				double angle = i * PI / 180;
    				res = max(res, sqrt(f * f + b * b - 2 * f * b * cos(angle)));
    			}
    		}
    		
    		return res;
    	}
    };
    

      

  • 相关阅读:
    echars 折线图使用
    echars 饼图使用
    React native中DrawerNavigator,StackNavigator,TabNavigator导航栏使用
    React native 中 SectionList用法
    React native 中使用Fetch请求数据
    React native中使用XMLHttpRequest请求数据
    实现在WebView中返回上一级
    DatePickerAndroid用法
    Lambda
    .Net常见线程安全问题整理
  • 原文地址:https://www.cnblogs.com/litstrong/p/2422457.html
Copyright © 2020-2023  润新知