PTA-列车调度问题

解题思路:

因为火车是逆序输出的,而且属于FIFO,所以一开始应该先去判断增加轨道的条件,而这个条件就是如果当前这个数字大于前一个数字,那么就开一个轨道(这保证了每一个轨道都是逆序输出的)

如果小于,则要从第一个轨道开始找,直到找到第一个大于该数的轨道,把该数放入这个轨道中

如果这个轨道是最上面的那个轨道,就把当前数认作前一个数字(下一次比较的时候就是比较这个值来判断是否要开辟轨道)

如果不是就只要把这个轨道的最小值设置一下就可以了,因为每次都是比较最小值,所以设置这个最小值会方便。我是使用数组来保存的,但是这个查找第一个大于该数的轨道时候会超时;测试点三运行超时会过不去

图因为传不过来就不传了,你点开这个网站的时候应该就已经看过图了吧

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

输入格式:

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

输出格式:

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

输入样例:

9
8 4 2 5 3 9 1 6 7

输出样例:

4

思路代码

 

#include<bits/stdc++.h>
using namespace std;
int main()
{
	
	int n;
	cin>>n;
	queue<int> q;
	for(int i = 0;i<n;i++)
	{
		int temp;
		cin>>temp;
		q.push(temp);
	}
	int pre=0;
	int arr[100005];//存放最小值,开小会段错误,根据题目来定
	int cur=0;
	while(n!=0)
	{
		int tt = q.front();
		q.pop();
		n--;
		if(tt>pre)
		{
			cur++;
			arr[cur] = tt;
			pre = tt;
		}else{
			
			for(int j = 1;j<=cur;j++)//应该是这里会超时
			{
				
				if(j==cur)//最上面轨道
				{
					pre = tt;
				}
				if(arr[j]>tt)
				{
					arr[j] = tt;
					break;
				}
			}
			
		}
	}
	cout<<cur<<endl;
	
 } 

优化AC代码

--用到SET结构(set结构放入元素的时候会自动排序)和二分查找函数减少运行时间,不知道set的可以去了解一下C++的STL

#include<bits/stdc++.h>
using namespace std;
set<int> sp;
int main()
{
	int n;
	cin>>n;
	set<int>::iterator it = sp.begin();
	for(int i = 0;i<n;i++)
	{
		int temp;
		cin>>temp;
		
		it = sp.lower_bound(temp);
		if(it!=sp.end())
		{
			sp.erase(it);
			sp.insert(temp);
		}else{
			sp.insert(temp);
		}
	}
	cout<<sp.size()<<endl;
}

 

浙江大学的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、付费专栏及课程。

余额充值