一直80分改不出来了
P2625 豪华游轮
大体思路就是将前进后退的指令放在一起,中间尽量旋转180度,剩下的最后再旋。
#include <bits/stdc++.h>
using namespace std;
int n,d,ans1,ans2,sz[51],fz[51],cur;
bool dp[100][361];
string s;
const double PI = acos(-1.0);
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin >> s >> d;
if(s[0]=='r')sz[++sz[0]]=d%360;
if(s[0]=='l')fz[++fz[0]]=d%360;
if(s[0]=='f')ans2+=d;
if(s[0]=='b')ans1+=d;
}
dp[0][0]=dp[0][360]=1;
for(int i=1;i<=sz[0];i++)
{
//if(sz[i]==0)continue;
for(int j=359;j;j--)
{
dp[i][j]=dp[i-1][j];
dp[i][j]|=dp[i-1][(j-sz[i]+360*10)%360];
}
}
for(int i=1+sz[0];i<=fz[0]+sz[0];i++)
{
//if(fz[i-sz[0]]==0)continue;
for(int j=1;j<360;j++)
{
dp[i][j]=dp[i-1][j];
dp[i][j]|=dp[i-1][(j+fz[i-sz[0]]+720)%360];
}
}
for(int i=0;i<=180;i++)
{
if(dp[fz[0]+sz[0]][180-i]||dp[fz[0]+sz[0]][180+i])
{
cur=i;
break;
}
}
double ans=sqrt(ans2*ans2+ans1*ans1+2*ans1*ans2* cos(cur* PI / 180));
printf("%.6f\n",ans);
return 0;
}