PTA 7-2 列车调度(25 分) 代码

本文探讨了火车站列车调度问题,通过分析列车序列,确定了使列车按递减排列离开车站所需的最少平行轨道数量。使用了一种算法来解决这个问题,并提供了具体的代码实现。

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

火车站的列车调度铁轨的结构如下图所示。

在这里插入图片描述

两端分别是一条入口(Entrance)轨道和一条出口(Exit)轨道,它们之间有N条平行的轨道。每趟列车从入口可以选择任意一条轨道进入,最后从出口离开。在图中有9趟列车,在入口处按照{8,4,2,5,3,9,1,6,7}的顺序排队等待进入。如果要求它们必须按序号递减的顺序从出口离开,则至少需要多少条平行铁轨用于调度?

输入格式:
输入第一行给出一个整数N (2 ≤ N ≤10^5),下一行给出从1到N的整数序号的一个重排列。数字间以空格分隔。

输出格式:
在一行中输出可以将输入的列车按序号递减的顺序调离所需要的最少的铁轨条数。

输入样例:
9
8 4 2 5 3 9 1 6 7
输出样例:
4
代码如下:

#include <stdio.h>
#include <stdlib.h>
int a[100005];
int main()
{
    int n,i,b,j=0,flag=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&b);
        if(j==0&&flag==0)
        {
            a[j]=b;
            flag=1;
        }
        else
        {
            if(b>a[j])
            {
                j++;
                a[j]=b;
            }
            else
            {
                int k;
                for(k=0;k<=j;k++)
                {
                    if(a[k]>b)
                        break;
                }
                a[k]=b;
            }
        }
    }
    printf("%d",j+1);
}
浙江大学的PTA(Practice Training Admission,实习训练申请)列车调度问题是一个经典的线性规划问题,通常用于教学中教授动态规划算法。在C语言中,你可以使用标准库函数如`glpk`、`lp_solve`等来进行求解。以下是一个简单的示例,展示如何使用`glpk`库解决此类问题: ```c #include <stdio.h> #include <stdlib.h> #include <glpk.h> // 定义列车和站点结构体 typedef struct { int id; int capacity; // 列车容量 } Train; typedef struct { int train_id; int station_id; int demand; // 站点需求量 int cost; // 运输成本 } Route; // 读取数据 void read_data(int trains[], Train* train_list, int routes[], Route* route_list, int& num_trains, int& num_routes) { // ... (这里填写读取数据的代码) } // 动态规划函数 int solve_train_scheduling(Train train_list[], int num_trains, Route route_list[], int num_routes) { // 初始化矩阵 int dp[2][num_routes + 1]; // dp[i][j]表示到达第j站,是否满载的最小成本 int prev_cost[num_trains]; for (int i = 0; i <= num_routes; i++) { dp[0][i] = INT_MAX; // 初始化边界条件 } for (int i = 1; i <= num_trains; i++) { // 遍历每列列车 // ... (这里填充动态规划状态转移方程) prev_cost[i - 1] = dp[1][num_routes]; } // 使用GLPK调用LP求解 glp_prob *prob = glp_create_prob(); glp_set_prob_name(prob, "Train Scheduling Problem"); // ... (设置模型参数,添加变量和约束) glp_load_matrix(prob, GLP_LO, num_routes + 1, num_trains, prev_cost); // 将dp数组加载到LP模型 glp_simplex(prob); double min_cost = glp_get_obj_val(prob); int best_solution[num_trains]; glp_get_col_prim(prob, GLP_DB_PRIM, 0, num_trains, best_solution); // 解析并返回结果 return min_cost; } int main() { int trains[] = {3, 4}; // 列车总数 Train train_list[2] = {...}; // ... (继续读取其他数据) int routes[] = {5}; // 路线总数 Route route_list[5] = {...}; int num_trains, num_routes; read_data(trains, &train_list[0], routes, &route_list[0], num_trains, num_routes); int optimal_cost = solve_train_scheduling(train_list, num_trains, route_list, num_routes); printf("Minimum cost for PTA training is: %d\n", optimal_cost); // ... (打印详细解决方案) return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值