题目描述

有一条豪华游轮(其实就是条小木船),这种船可以执行4种指令:

right X : 其中X是一个1到719的整数,这个命令使得船顺时针转动X度。

left X : 其中X是一个1到719的整数,这个命令使得船逆时针转动X度。 forward X : 其中X是一个整数(1到1000),使得船向正前方前进X的距离。

backward X : 其中X是一个整数(1到1000),使得船向正后方前进X的距离。

随意的写出了n个命令,找出一个种排列命令的方法,使得船最终到达的位置距离起点尽可能的远。

输入输出格式
输入格式:

第一行一个整数n(1 <= n <= 50),表示给出的命令数。

接下来n行,每行表示一个命令。

输出格式:

一个浮点数,能够走的最远的距离,四舍五入到6位小数。

输入输出样例

输入样例#1:
3
forward 100
backward 100
left 90

输出样例#1:
141.421356


【分析】
蛋疼…贪心


【代码】

//The Problem 3
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const double PI=acos(-1.0);
const int mxn=55;
char s[15];
int n,back,to;
int jiao[55];
int f[19000];
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int main()
{
int i,j,x,t1,t2,p,mn=180;
double v=0.0,ot;
n=read();
fo(i,1,n)
{
scanf("%s",s);
x=read();
if(s[0]=='f') to+=x;
else if(s[0]=='l') jiao[++jiao[0]]=x%360;
else if(s[0]=='r')
{
x=-x;
while(x<0) x+=360;
jiao[++jiao[0]]=x;
}
else back+=x;
}
if(to>back) v+=to,ot=back;
else v+=back,ot=to;
f[0]=1;
fo(i,1,jiao[0])
for(j=18000;j>=jiao[i];j--)
f[j]=max(f[j],f[j-jiao[i]]);
fo(j,0,18000)
if(f[j])
if(abs(180-(j%360))<mn)
mn=abs(180-(j%360));
double ang=mn;
v=v+ot*(cos(ang*PI/180.0));
double tmp=ot*(sin(ang*PI/180.0));
v=sqrt(v*v+tmp*tmp);
printf("%f\n",v);
return 0;
}