zoukankan      html  css  js  c++  java
  • [代码]ural 1655 Somali Pirates

    Abstract

    ural 1655 Somali Pirates

    dp

    Source

    http://acm.timus.ru/problem.aspx?space=1&num=1655

    Solution

    dp水题,但是我3y,所以不算水题。

    Code

    #include <cassert>
    #include <iostream>
    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const double EPS = 1e-6;
    const double INF = 1e8;
    
    double da, w;
    int N;
    bool vis[555][555][2];
    double f[555][555][2];
    int path[555][555][2];
    
    struct snode {
        int id;
        double a, t;
        void read(int i) {
            id = i;
            double d, v;
            cin>>a>>d>>v;
            a -= da;
            if (a<-EPS) a += 360;
            t = (d-1)/v*60;
        }
        bool operator<(const snode &rhs) const {
            return a<rhs.a;
        }
    }node[555];
    
    inline double cost(int i, int j) {
        return min(360-fabs(node[i].a-node[j].a),
                fabs(node[i].a-node[j].a))/w;
    }
    
    double dfs(int i, int j, int d) {
        if (vis[i][j][d]) return f[i][j][d];
        f[i][j][d] = INF;
        vis[i][j][d] = 1;
        if (i==0&&d==0 || j==N+1&&d==1) return f[i][j][d];
        if (d==0) {
            double t = dfs(i-1, j, 0)+cost(i-1, i);
            if (t<node[i].t+EPS && t<f[i][j][d]-EPS) {
                f[i][j][d] = t;
                path[i][j][d] = 0;
            }
            t = dfs(i-1, j, 1)+cost(j, i);
            if (t<node[i].t+EPS && t<f[i][j][d]-EPS) {
                f[i][j][d] = t;
                path[i][j][d] = 1;
            }
        }
        else {
            double t = dfs(i, j+1, 1)+cost(j, j+1);
            if (t<node[j].t+EPS && t<f[i][j][d]-EPS) {
                f[i][j][d] = t;
                path[i][j][d] = 1;
            }
            t = dfs(i, j+1, 0)+cost(i, j);
            if (t<node[j].t+EPS && t<f[i][j][d]-EPS) {
                f[i][j][d] = t;
                path[i][j][d] = 0;
            }
        }
        return f[i][j][d];
    }
    
    void write(int i, int j, int d, int dep) {
        if (dep==N) return;
        if (d) write(i, j+1, path[i][j][d], dep+1);
        else write(i-1, j, path[i][j][d], dep+1);
        printf("%d\n", d?node[j].id:node[i].id);
    }
    
    int main() {
        int i, j, k;
        while (cin>>da>>w>>N) {
            w *= 360; //degree per minute
            for (i = 1; i <= N; ++i)
                node[i].read(i);
            sort(node+1, node+N+1);
            node[0].a = 0, node[N+1].a = 360;
            memset(vis, 0, sizeof vis);
            f[0][N+1][0] = f[0][N+1][1] = 0;
            vis[0][N+1][0] = vis[0][N+1][1] = 1;
            int ansi, ansd;
            double ans = INF;
            for (i = 0; i <= N; ++i)
                for (k = 0; k < 2; ++k) {
                    if (dfs(i, i+1, k)<ans-EPS) {
                        ans = dfs(i, i+1, k);
                        ansi = i;
                        ansd = k;
                    }
                }
            if (ans < 1e6) {
                printf("%f\n", ans);
                write(ansi, ansi+1, ansd, 0);
            }
            else puts("Impossible");
        }
        return 0;
    }
  • 相关阅读:
    冒泡排序(可传函数参数)
    字符串转化成整数
    遍历文档内容,得到HTML层级结构
    跨域通信问题
    矩阵的快速幂
    CSS tricks
    牛客赛马网笔试攻略
    项目中遇到的问题
    Mysql远程链接访问权限设置
    恢复delete删除的数据
  • 原文地址:https://www.cnblogs.com/jffifa/p/2730335.html
Copyright © 2011-2022 走看看