动态规划——A Spy in the Metro UVA - 1025

本文介绍了一种使用线性动态规划解决列车调度问题的方法,通过记录每个时刻每个车站左右方向是否有列车到来,结合三种状态(等待、上左车、上右车),判断并计算出下一个状态所需的等待时间。文章提供了详细的代码实现,包括如何处理时间下标和车辆记录,以及DP过程中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题解:

这道题目基本上是线性dp,,只需要在记率每个时刻,每个车站左边或者右边有木有车驶来,

一共有三种状态(等待,上左车,上右车),就可以判断下一状态需要等待的时间了,具体解法紫书上有说明

注意点:需要注意你保存每一站的时间的下标是怎样的,然后根据你的下标在你记录车辆的时候注意下标,dp的时候也要注意下标

 

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int inf = 0x3f3f3f3f;

int n,t;        //车站数和约定的时间
int tim[55];    //每个车站的行走时间
int m1,m2;
int hav_train[300][55][2];  //某个时间点某个车站某个方向有木有车
int dp[255][55];    //某个时间某个车站的已经等待时间

void add_train(int tt, int f) { //某个时间某个方向发车
    if(!f) {
        hav_train[tt][1][0] = 1; //f为0车站从右边出发
        for(int i = 1; i < n-1; i++) {
            tt = tt+tim[i];
            if(tt > 200) break;   //已经超过约定的最大时间
            hav_train[tt][i+1][0] = 1; //f为0车站从右边出发
        }
    }
    else {
        hav_train[tt][n][1] = 1;
        for(int i = n-1; i > 1; i--) {
            tt = tt+tim[i];
            if(tt > 200) break;   //已经超过约定的最大时间
            hav_train[tt][i][1] = 1; //f为0车站从右边出发
        }
    }
}

int main()
{
    //freopen("in.txt","r",stdin);

    int rnd = 0;
    while(scanf("%d",&n) == 1 && n) {
        memset(hav_train,0,sizeof(hav_train));

        scanf("%d",&t);
        for(int i = 1; i <= n-1; i++)   //只有n-1个间隔
            scanf("%d",&tim[i]);    //1代表1-2的时间

        int tmp;
        scanf("%d",&m1);
        for(int i = 0; i < m1; i++) {
            scanf("%d",&tmp);
            add_train(tmp,0);
        }
        scanf("%d",&m2);
        for(int i = 0; i < m2; i++) {
            scanf("%d",&tmp);
            add_train(tmp,1);
        }

        memset(dp,inf,sizeof(dp));
        dp[0][1] = 0;   //0时刻第一个车站等待时间为0
        for(int i = 0; i <= t; i++) {   //遍历每个时间和车站
            for(int j = 1; j <= n; j++) {
                dp[i+1][j] = min(dp[i+1][j],dp[i][j]+1);
                if(hav_train[i][j][0]) dp[i+tim[j]][j+1] = min(dp[i+tim[j]][j+1],dp[i][j]);
                if(hav_train[i][j][1]) dp[i+tim[j-1]][j-1] = min(dp[i+tim[j-1]][j-1],dp[i][j]);
            }
        }

        if(dp[t][n] < inf) printf("Case Number %d: %d\n",++rnd,dp[t][n]);
        else printf("Case Number %d: impossible\n",++rnd);
    }

    return 0;
}

 

### 集成和配置 `p6spy-spring-boot-starter` 在 Spring Boot 应用 #### 安装依赖项 为了在Spring Boot应用程序中集成`p6spy-spring-boot-starter`,需向项目的构建文件添加相应的Maven或Gradle依赖声明。对于Maven项目,在`pom.xml`文件内加入如下片段: ```xml <dependency> <groupId>com.github.gavlyukovskiy</groupId> <artifactId>p6spy-spring-boot-starter</artifactId> <version>1.8.0</version> </dependency> ``` 针对采用Gradle作为构建工具的情况,则应在`build.gradle`里追加这行语句[^1]: ```groovy implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0' ``` #### 修改数据库连接属性 完成上述操作之后,还需调整`application.properties`或者`application.yml`中的数据源设置来启用P6Spy功能。具体来说就是把原有的JDBC URL替换为带有`p6spy:`前缀的新形式。 例如原本的URL可能形似这样: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC ``` 现在应该改成下面的样子以便让P6Spy介入SQL执行过程并记录日志信息[^2]: ```properties spring.datasource.url=p6spy:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC ``` #### 自定义 P6Spy 行为 (可选) 如果希望进一步定制化P6Spy的行为模式,比如更改默认的日志输出格式或是指定特定条件下的拦截策略等,可以通过创建名为`spy.properties`的资源文件实现更精细控制。此文件通常放置于类路径根目录下(`src/main/resources/`),其内部结构遵循键值对的形式书写各项参数设定[^3]。 ```properties modulelist=com.p6spy.engine.spy.P6SpyFactory,com.example.MyCustomModule logMessageFormat=com.p6spy.engine.logging.appender.Slf4JLogger excludecategories=info,debug,result,batch includecategories=sql,statement executionThreshold=50 ``` 以上即是在Spring Boot应用当中引入以及初步配置`p6spy-spring-boot-starter`的方法概述;通过这些步骤能够有效监控应用程序发出的所有SQL指令及其性能表现情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值