码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷P2625 豪华游轮

时间:2016-09-25 22:15:34      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

 

题目描述

有一条豪华游轮(其实就是条小木船),这种船可以执行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

 

洛谷P2625 豪华游轮

标签:

原文地址:http://www.cnblogs.com/SilverNebula/p/5906988.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!