洛谷 P2625 豪华游轮

来源:互联网 发布:centos vsftpd 配置 编辑:程序博客网 时间:2024/04/26 00:36

题目描述

有一条豪华游轮(其实就是条小木船),这种船可以执行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;}
0 0
原创粉丝点击