NC21408. 机器人
描述
输入描述
第一行先输入一个整数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); }