题目链接
Solution
贼有意思的一个题目。
可以发现阻止我们走的更远的就是那些需要反向走的路程。
然后发现当角度越接近 \(180^\circ\) ,对我们最终的答案则更优。
所以先是一个背包把可以达到的角度处理一下,然后再直接算就好了。
卡精度。
Code
#include<bits/stdc++.h>
#define pi 3.141592653589
using namespace std;
int p[1001];
int n,cnt,tot;
int v[400],h[400];
double ans=1000,sum,sup;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
string s; cin>>s;
int ww; cin>>ww;
if(s[0]=='f') sum+=ww;
if(s[0]=='b') sup+=ww;
if(s[0]=='l') p[++cnt]=-ww;
if(s[0]=='r') p[++cnt]=ww;
}
v[0]=1;
for(int i=1;i<=cnt;i++)
for(int j=0;j<360;j++)
{
if(v[j])
h[(j+p[i]+3600)%360]=1;
v[j]=h[j];
}
for(int i=0;i<360;i++)
if(!v[i]) continue;
else
if(abs(i-180)<ans)
ans=abs(i-180);
ans=(ans/(180*1.0000))*pi;
double kk=cos(ans);
double cc=sin(ans);
double hen=sup*cc;
double shu=sup*kk+sum;
double Ans=sqrt(pow(hen,2)+pow(shu,2));
printf("%.6lf\n",Ans);
return 0;
}