[无聊测试赛] T7 豪华游轮

观察题目,发现可以贪心能往前走多少往前走多少,然后尽量扭180度后退.剩下角度可以通过原地扭屁股实现,并不会影响距离

开两个变量分别记录往前走和往后走的距离.角度只需一个数组,往左记为 ( heta) ,往右记为 (360- heta)

怎么找最接近 (180) ?背包...

答案怎么找?假设我们从 ((0,0)) 出发,如果找到终点的 (x)(y) 就能用勾股定理求出距离.x的值为往前走的值 * 往后走的值 (cos( heta)),y的值为往后走的值 * (sin( heta))

蓝色与绿色夹角是我们求出来的,用三角函数能找出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));
}
原文地址:https://www.cnblogs.com/DannyXu/p/12536355.html