羅区P2625クルーズ船

トピックリンク:

タイトル

トピック分析:

明らかに、このプロセスは、以下のプロセスに分けることができます

  • あなたは仕上がりを楽しみに行くことができます
  • 元に戻すに最も近い\(180°\)
  • あなたはフィニッシュに戻ることができます
  • 位フィニッシュは、回転操作の残りターンしない
    、なぜならとにかく、何の変位を制御することはできません最後のステップを

類似した、アクションを元に戻すように動作するために必要なものです\(0/1 \)思考バックパック\(DP \)その後、何余弦定理ができ、それは

コード:

#include<bits/stdc++.h>
using namespace std;
inline int read() {
    int cnt = 0, f = 1; char c = getchar();
    while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
    while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + (c ^ 48); c = getchar();}
    return cnt * f;
}
int n, x, f, b, p = 1e3;
const double PI = 3.1415926535;
int trn[55], cnt;
double ans;
bool dp[55][361];
char c[10];
int main() {
    n = read();
    for (register int i = 1; i <= n; ++i) {
        scanf("%s", c + 1), x = read();
        if (c[1] == 'f') f += x;
        if (c[1] == 'b') b += x;
        if (c[1] == 'r') trn[++cnt] = -x;
        if (c[1] == 'l') trn[++cnt] = x;
    }
    ans += f;
    dp[0][0] = 1;
    for (register int i = 1; i <= cnt; ++i)
        for (register int j = 0; j < 360; ++j)
            if (dp[i - 1][j] == 1) 
                dp[i][j] = 1, dp[i][(j + trn[i] + 360 * 10) % 360] = 1;
    
    for (register int i = 0; i < 360; ++i)
        if (dp[cnt][i] == 1) p = min(p, abs(i - 180));
    
    ans = sqrt(f * f + b * b + 2 * b * f * cos(p * PI / 180));
    printf("%.6lf", ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/kma093/p/11627279.html