题目描述
有一条豪华游轮(其实就是条小木船),这种船可以执行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
贪心思想。命令可以随意排列,那么开场肯定是全军突击(误),把所有前进指令都用完(走一半拐弯再走,肯定不如全程直走好),然后转向,尽可能接近180°,再倒着走。
求最适合的转向角度,我选择偷懒暴搜。偷懒的结果就是50分,剩下50分T掉了。
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 using namespace std; 8 const int mxn=60; 9 const double pi=3.141592653; 10 int read(){ 11 int x=0,f=1;char ch=getchar(); 12 while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 13 while(ch>=‘0‘ && ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 14 return x*f; 15 } 16 double an[mxn]; 17 double fw[mxn]; 18 double nx,ny; 19 int acnt=0,rcnt=0; 20 double dist(double x1,double y1,double x2,double y2){ 21 return sqrt( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) ); 22 } 23 int n; 24 double ans=0; 25 double ttd=0; 26 void dfs(int rk,double now){ 27 // printf("%d %.4f\n",rk,now); 28 if(rk>acnt){ 29 double tnow=fabs(now); 30 double tmpx=nx+ttd*sin(tnow*pi/180); 31 double tmpy=ny+ttd*cos(tnow*pi/180); 32 // printf("%d %.4f %.4f\n",rk,tmpx,tmpy); 33 ans=max(ans,dist(tmpx,tmpy,0,0)); 34 return; 35 } 36 dfs(rk+1,now); 37 // printf("%.5f\n",now+an[rk]); 38 dfs(rk+1,now+an[rk]); 39 return; 40 } 41 int main(){ 42 n=read(); 43 int i,j; 44 char ch[20];double x; 45 nx=ny=0; 46 for(i=1;i<=n;i++){ 47 scanf("%s%lf",ch,&x); 48 if(ch[0]==‘f‘){ 49 fw[++rcnt]=x; 50 } 51 if(ch[0]==‘b‘){ 52 fw[++rcnt]=-x; 53 } 54 if(ch[0]==‘l‘){ 55 an[++acnt]=-x; 56 // printf("in:%d",acnt); 57 if(an[acnt]<-360)an[acnt]+=360; 58 } 59 if(ch[0]==‘r‘){ 60 an[++acnt]=x; 61 if(an[acnt]<360)an[acnt]-=360; 62 } 63 } 64 ttd=0; 65 for(i=1;i<=n;i++){ 66 if(fw[i]>0) 67 ny+=fw[i]; 68 else ttd+=fw[i]; 69 } 70 sort(an+1,an+acnt+1); 71 dfs(0,0); 72 // 73 // 74 /* printf(" %d\n",dgans); 75 nx+=ttd*cos(dgans); 76 ny+=ttd*sin(dgans);*/ 77 // printf("%.4f %.4f\n",nx,ny); 78 printf("%.6f\n",ans); 79 return 0; 80 }
DFS
正解是DP。懒得写了,从rlt那里抄了代码233
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdio> 4 #include<cmath> 5 using namespace std; 6 const double pi=3.1415926535; 7 int n,sf,sb,p,ang[55]; 8 double ans; 9 bool f[105][405]; 10 int main() 11 { 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++) 14 { 15 int x; 16 char ch[11]; 17 scanf("%s%d",ch,&x); 18 if(ch[0]==‘f‘) 19 sf+=x; 20 if(ch[0]==‘b‘) 21 sb+=x; 22 if(ch[0]==‘r‘) 23 ang[++ang[0]]=x; 24 if(ch[0]==‘l‘) 25 ang[++ang[0]]=-x; 26 } 27 f[0][0]=1; 28 for(int i=1;i<=ang[0];i++) 29 for(int j=0;j<360;j++) 30 if(f[i-1][j]) 31 f[i][j]=1,f[i][(j+ang[i]+720)%360]=1; 32 p=180; 33 for(int i=0;i<360;i++) 34 if(f[ang[0]][i]) 35 p=min(p,abs(i-180)); 36 ans=sqrt(sf*sf+sb*sb+2*sb*sf*cos(p*pi/180)); 37 printf("%.6f\n",ans); 38 return 0; 39 }
正解dp
时间: 2024-10-20 20:18:33