参考:https://blog.csdn.net/u012662688/article/details/50898476
#include <bits/stdc++.h>
#define FF(a,b) for(int a=0;a<b;a++)
#define F(a,b) for(int a=1;a<=b;a++)
#define LEN 100
#define INF 1000000
#define bug(x) cout<<#x<<"="<<x<<endl;
using namespace std;
typedef long long ll;
const double pi=acos(-1);
int main()
{
// freopen("./in","r",stdin);
int T,N;
char op[10];
int d;
scanf("%d",&T);
while(T--){
scanf("%d",&N);
int f=0,b=0;
vector<int> angle;
while(N--){
scanf("%s",op);
scanf("%d",&d);
switch(op[0]){
case 'f':
f+=d;
break;
case 'b':
b+=d;
break;
case 'l':
angle.push_back(360-d);
break;
case 'r':
angle.push_back(d);
break;
}
}
set<int> rec; //必须用set去重做记录,否则内存超限
//记录所有可能的角度组合
FF(i,angle.size()){ //对所有角度进行遍历
vector<int> tmp(rec.begin(),rec.end());
int sz=rec.size();
FF(j,sz) { //已记录角度
//对所有角度进行相加
rec.insert((tmp[j]+angle[i])%360);
}
//放入当前角度
rec.insert(angle[i]);
}
int minA=180;
set<int>::iterator it=rec.begin();
while(it!=rec.end()){
int a= *it;
int delta=abs(a-180);
minA=min(delta,minA);
it++;
}
double A=f,B=b;
double rad=((180.-minA)/180.)*pi;
double ans=sqrt(A*A+B*B-2*A*B*cos(rad));
printf("%.3f\n",ans);
}
return 0;
}