洛谷P2625 豪华游轮

题目描述

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

洛谷P2625 豪华游轮的相关文章

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不

洛谷P1466 集合 Subset Sums

洛谷P1466 集合 Subset Sums这题可以看成是背包问题 用空间为 1--n 的物品恰好填充总空间一半的空间 有几种方案 01 背包问题 1.注意因为两个交换一下算同一种方案,所以最终 要 f [ v ] / 2 2.要开 long long 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <string&g

洛谷P1160 队列安排 链表

洛谷P1160 队列安排   链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std

洛谷 P3367 并查集模板

#include<cstdio> using namespace std; int n,m,p; int father[2000001]; int find(int x) { if(father[x]!=x) father[x]=find(father[x]); return father[x]; } void unionn(int i,int j) { father[j]=i; } int main() { scanf("%d%d",&n,&m); for

[题解]洛谷比赛『期末考后的休闲比赛2』

[前言] 这场比赛已经结束了有几天,但我各种忙,虽然AK但还是没来得及写题解.(我才不会告诉你我跑去学数据结构了) T1 区间方差 (就不贴题好了) 首先可以推公式(我们可以知道,线段树然而并不能通过初中学过的方差公式在log(L)内求出方差): (s2表示方差,L表示区间长度,xi表示区间的每一项,最后一个x上画了一根线表示这些数据的平均数) 用二项式定理完全平方公式可得: 再次展开: 另外,再代入以下这个 得到了: 然后继续吧.. 然后duang地一声合并同类项,于是我们得到了: 然后可以高

洛谷P1471 方差

蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数.他想算算这个数列的平均数和方差. ——by 洛谷; http://www.luogu.org/problem/show?pid=1471 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<