码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-03-21 09:49:42      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:using   oss   数组   后退   答案   abs   ==   turn   min   

观察题目,发现可以贪心能往前走多少往前走多少,然后尽量扭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));
}

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

标签:using   oss   数组   后退   答案   abs   ==   turn   min   

原文地址:https://www.cnblogs.com/DannyXu/p/12536355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!