火车车厢重排(链队列)

1.题目:

 

Problem Description

一列货运列车共有n节车厢,每节车厢将停放在不同的车站。假定n个车站的编号分别为1~n,即货运列车按照第n站至第1站的次序经过这些车站。为了便于从列车上卸掉相应的车厢,车厢的编号应与车站的编号相同。这样,在每个车站只需卸掉最后一节车厢。因此,对于给定的任意次序车厢,必须进行重新排列,使其符合要求。车厢重排工作可通过转轨站完成,在转轨站中有一个入轨、一个出轨和k个缓冲轨,缓冲轨位于入轨和出轨之间。假定缓冲轨按先进先出的方式工作,现要求设计算法解决火车车厢重排问题。

 

Input

有多组数据,每组第一行为车厢节数n和缓冲轨数目k(2<=k<=5,k<=n<=10),第二行为初始给定的车厢编号次序序列。

 

Output

若给定的车厢编号次序序列可重排,则输出1;否则输出0。

 

Sample Input

9 3
3 6 9 2 4 7 1 8 5
9 3
3 6 9 2 4 7 5 8 1

 

Sample Output

1
0

 

 

2.参考代码:

 

#include <iostream>
using namespace std;

struct Node{
	int data;
	Node* next;
};

class LinkQueue{
private:
	Node* front,* rear;
public:
	LinkQueue();   ///构造函数
	~LinkQueue();   ///析构函数
	void EnQueue(int x);   ///入队列
	int DeQueue();   ///出队列
	int GetFront(){   ///获得队头元素
		if(!empty())
			return front->next->data;
	}
	int GetRear(){   ///获得队尾元素
		if(front!=rear)
			return rear->data;
	}
	bool empty(){   ///判断队列是否为空
		if(front==0)
			return true;
		else
			return false;
	}
	void Trans();   ///遍历火车车厢序列
	friend void PermuteTrans(int* arr,LinkQueue* a,int n,int k);   ///重排火车车厢序列
};

LinkQueue::LinkQueue(){
	Node* s=new Node;
	s->next=NULL;
	front=rear=s;
}

LinkQueue::~LinkQueue(){
	Node* p=new Node;
	p->next=NULL;
	front=rear=p;
}

void LinkQueue::EnQueue(int x){
	Node* s=new Node;
	s->data=x;
	s->next=NULL;
	rear->next=s;
	rear=s;
}

int LinkQueue::DeQueue(){
	if(!empty()){   ///队列不空才能出队
		Node* p=new Node;
		p=front->next;
		int x=p->data;
		if(p->next==NULL)
			rear=front;
		delete p;
		return x;
	}
}

void LinkQueue::Trans(){
	Node* p=front->next;
	while(p){
		cout<<p->data<<" ";
		p=p->next;
	}
}

void PermuteTrans(int* arr,LinkQueue* a,int n,int k){
	int i=0;
	bool flag=true;   ///设置标志,初始为真
	while(i<n && flag){   ///当还有车厢没有进入缓冲轨时
		flag=false;   ///改变标志
		for(int j=0;j<k;j++)
		{
			if(a[j].GetRear()<arr[i] || a[j].front->next==NULL)
				///如果某条缓冲轨道的第一个车厢的编号小于即将进来的车厢编号,那么他就可以进入轨道
				///或者某条缓冲轨道空置的时候也可以进入轨道
			{
				a[j].EnQueue(arr[i]);   ///入队列
				flag=true;   ///改变标志
				i++;   ///下标加一
				break;   
			}
		}
	}
	if(flag)   ///如果全部进入轨道,说明可以排
		cout<<1<<endl;
	else   ///否则排不了
		cout<<0<<endl;
}

int main()
{
	int i,n,k,a[1111];
	while(cin>>n>>k)
	{
		for(i=0;i<n;i++)
			cin>>a[i];
		LinkQueue lq;
		for(i=0;i<n;i++)
			lq.EnQueue(a[i]);
		LinkQueue* H=new LinkQueue[k];
		PermuteTrans(a,H,n,k);
	}
	return 0;
}


 

 

 

 

 

 

### 风光预测误差数据集的获取 风光预测误差分析是评估风能和太阳能发电性能的重要手段之一。通过收集实际发电量与预测发电量之间的偏差,可以进一步改进预测模型并提升电力系统的稳定性。以下是关于风光预测误差数据集的相关信息: #### 数据集来源 1. **NREL (National Renewable Energy Laboratory)** 提供了丰富的公开数据集,其中包括风速、太阳辐射强度以及对应的预测值和真实值。这些数据通常被用于机器学习模型训练和验证。具体来说,NREL 的 Wind Integration National Dataset Toolkit 和 Solar Power Data for Model Validation 是两个常用的选择[^1]。 2. **MERRA-2 Reanalysis Data** 来自 NASA,提供了高分辨率的大气再分析数据,包括风速、温度、湿度等气象参数。虽然该数据集本身并不直接提供预测误差,但它可以通过与其他预测工具结合来计算误差。 3. **Global Weather Forecasting Datasets** 如 ECMWF 或 GFS 提供了长期的历史天气预报数据,可用于构建预测模型并与实测数据对比以获得误差统计。 4. **Kaggle 平台上的竞赛项目** 经常发布与可再生能源相关的数据集,其中一些专门针对风光预测误差展开研究。例如,“Wind Turbine SCADA and Fault Detection” 就是一个典型的例子,它包含了详细的风机运行状态及相应的预测精度指标[^2]。 #### 数据处理与清洗 在下载原始数据之后,可能需要对其进行预处理才能满足特定需求: - 剔除异常点:由于传感器故障或其他原因造成的极端数值会影响最终结果; - 时间同步校准:确保不同源的时间戳一致以便后续比较; - 缺失值填补:采用插值法或者基于邻近时刻的方法补全缺失部分。 对于 Python 用户而言,Pandas 库非常适合完成以上任务;而对于 MATLAB 用户,则可以直接利用内置函数实现类似功能。 ```python import pandas as pd from sklearn.impute import SimpleImputer # 加载CSV文件 data = pd.read_csv('forecast_error.csv') # 替换无穷大/小数为NaN data.replace([np.inf, -np.inf], np.nan, inplace=True) # 使用均值填充缺失值 imputer = SimpleImputer(strategy='mean') cleaned_data = imputer.fit_transform(data) ``` #### 推荐使用的评价标准 当分析预测误差时,常用的度量方式有 MAE(Mean Absolute Error),RMSE(Root Mean Square Error) 及 NMAE(Normalized Mean Absolute Error)[^3]: \[ \text{MAE}=\frac{\sum_{i=1}^{n}|y_i-\hat y_i|}{n},\quad \text{RMSE}= \sqrt {\frac {1}{n}\sum _{{i=1}}^{n}(y_{{i}}-{\hat {{y}_{{i}}})^{2}},\quad \text{NMAE}={\frac {\mathrm {MAE}}{{\bar {y}}}} \] 其中 \( y_i,\hat y_i\) 分别表示第 i 次测量的实际值和估计值,n 表示样本总数。\(\bar{y}\)代表平均观测值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值