列表

详情


NC21408. 机器人

描述

有一个机器人在平面直角坐标系中进行如下四种操作:
1:right x  , 顺时针旋转x度
2:left x, 逆时针旋转x度
3:forward x , 沿着当前方向行进x度
4:backward x,沿着当前方向的反方向行进x度

现在给你机器人做过的操作,但是不知道操作的顺序,问你如何合理的安排这些操作使得机器人的结束位置与开始位置的欧几里得距离最大

输入描述

第一行先输入一个整数n (1 ≤ ≤ 50)
接下来n行每行输入一个操作,角度在1到359之间

输出描述

输出一个浮点数,误差不超过1e-7

示例1

输入:

3
forward 100
backward 100
left 90

输出:

141.4213562373095

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 520K, 提交时间: 2023-01-18 12:50:50

#include<bits/stdc++.h>
using namespace std;
int x[4];
map<string,int>st;
int dp[18001],s[100],cnt;
int f[4];
double get(double a,double b)
{
    return sqrt(a*a+b*b);
}
int main()
{
    int n,a;
    cin>>n;
    st["right"]=1,st["left"]=2,st["forward"]=3,st["backward"]=4;
    for(int i=0;i<n;i++)
    {
        string x;
        cin>>x>>a;
        f[st[x]]+=a;
        if(st[x]==1)s[cnt++]=a;
        if(st[x]==2)s[cnt++]=360-a;
    }
    dp[0]=1;
    for(int i=0;i<cnt;i++)
    {
        for(int j=18000;j>=s[i];j--)dp[j]|=dp[j-s[i]];
    }
    for(int i=18000;i;i--)dp[i%360]|=dp[i];
    double ans=0;
    bool flag=0;
    for(int i=180,j=180;i;i--,j++)
    {
        if(dp[i]|dp[j])
        {
                double t;
                if(dp[i])t=i;
                else t=j;
                t+=180;
                t/=180/acos(-1);
                double maxx = max(f[3],f[4]),minn=min(f[3],f[4]);    
                ans=get(maxx+minn*cos(t),minn*sin(t));   
            flag=1;break;
        }
    }
    if(!flag)
    {
        ans=abs(f[3]-f[4]);
    }
    printf("%.15lf\n",ans);
}

上一题