[无聊测试赛] T7 豪华游轮
观察题目,发现可以贪心能往前走多少往前走多少,然后尽量扭180度后退.剩下角度可以通过原地扭屁股实现,并不会影响距离
开两个变量分别记录往前走和往后走的距离.角度只需一个数组,往左记为 \(\theta\) ,往右记为 \(360-\theta\) 度
怎么找最接近 \(180\) ?背包...
答案怎么找?假设我们从 \((0,0)\) 出发,如果找到终点的 \(x\) 和 \(y\) 就能用勾股定理求出距离.x的值为往前走的值 * 往后走的值 \(cos(\theta)\),y的值为往后走的值 * \(sin(\theta)\)
蓝色与绿色夹角是我们求出来的,用三角函数能找出x和y
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
const int mod = 360;
const int MAXN = 725;
int n, fwd,bwd,tot,degree = mod;
double x_coord, y_coord;
int pos[MAXN];
int dp[MAXN * mod];
bool vis[MAXN*mod];
double dist(double a, double b){
return sqrt(a*a+b*b);
}//勾股定理
const double pi = 3.1415926535897932;
double cvt(double deg){
double angle = deg;
double result =(angle * pi)/180;
return result;
}//角度转化为弧度
int main(){
cin >> n;
for (int i=0;i<n;i++){
string a;int b;cin >> a >> b;
if(a[0]=='f') fwd+=b;
else if (a[0]=='b') bwd += b;
else if (a[0]=='l') pos[++tot] = b%mod;
else pos[++tot] = 360-(b%mod);
}
vis[0] = true;
for (int i=1;i<=tot;i++){
for (int j=MAXN*n;j>=0;j--){
if (pos[i]>j) break;
if (vis[j-pos[i]]){
vis[j] = true;
degree = min(degree,abs((j%mod)-180));
}//背包
}
}
x_coord = (double)fwd+(double)bwd*cos(cvt(degree));
y_coord = (double)bwd * (double)sin(cvt(degree));
//找x和y的值
printf("%.6f",dist(x_coord,y_coord));
}