1033 To Fill or Not to Fill (25 分)

本文介绍了一种基于加油站分布和油价信息,通过算法计算车辆从起点到终点的最优行驶路径和最低成本的方法。该算法首先将终点视为一个特殊加油站,并对所有加油站按距离进行排序。然后,通过比较当前油箱油量、加油站之间的距离和油价,决定是否在某个加油站加油,以达到总成本最低的目标。

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

#include<bits/stdc++.h>
using namespace std;
struct Node{
	double dis;
	double price;
};
bool cmp(Node a,Node b){
	return a.dis<b.dis;
}
bool cmp1(Node a,Node b){
	return a.price<b.price;
}
int main()
{
	//freopen("in.txt","r",stdin);
	double cmax,d,davg,n;
	cin>>cmax>>d>>davg>>n;
	vector<Node> station;
	station.resize(n);
	for(int i=0;i<n;i++){
		cin>>station[i].price>>station[i].dis;
	}
	Node l;l.dis=d;l.price=0;
	station.push_back(l);//终点也作为一个加油站 
	sort(station.begin(),station.end(),cmp);//按距离远近排序 
	Node nowstation=station[0]; 
	double distance=0;//当前位置 
	double tank=0;//到达某站点时刻的油箱油量 
	double cost=0;//到达某站点时刻花费 
	double limitd=cmax*davg;//加满油能跑的距离 
	if(nowstation.dis>0){//如果最近的站点不在原点就直接结束 
		printf("The maximum travel distance = 0.00");return 0;
	}
	while(distance<d){//当前位置未到终点就继续循环 
		vector<Node> ppp,ttt;//维护两个容器,ppp是limited以内price小于nowstation价格的站点,ttt是limited以内的所有站点 
		for(int i=0;i<station.size();i++){
			if(station[i].dis-distance<=limitd&&station[i].dis-distance>0){
				ttt.push_back(station[i]);
				if(station[i].price<nowstation.price){
					ppp.push_back(station[i]);
				}
			}
		}
		if(ppp.size()>0){//如果limited以内有价格更小的站点 
			if(tank*davg+nowstation.dis<ppp[0].dis){//如果油箱当前油量不够走到这个价格更小的站点 
				cost+=(ppp[0].dis-(nowstation.dis+tank*davg))*nowstation.price/davg;
				tank=0;
				distance=ppp[0].dis;
				nowstation=ppp[0];
			}else{//如果邮箱内的油量足够走到这个价格更小的站点 
				tank-=((ppp[0].dis-nowstation.dis)/davg);
				distance=ppp[0].dis;
				nowstation=ppp[0];
			}
		}else{//如果limited以内没有价格更小的站点 
			if(ttt.size()>0){//如果limited以内还有站点 
				sort(ttt.begin(),ttt.end(),cmp1);//选择这些站点中的价格最小的站点 
				cost+=((cmax-tank)*nowstation.price);//当前站点加满油 
				tank=cmax-(ttt[0].dis-nowstation.dis)/davg;//到达那个价格最小的站点(虽然最小但依旧大于当前站点价格),计算到达时刻油箱油量 
				distance=ttt[0].dis;
				nowstation=ttt[0];
			}else{//如果limited以内没有站点就加满油,计算走的最远距离,结束 
				distance+=cmax*davg;break;
			}
		}
	}
	if(distance<d){//结束 
		printf("The maximum travel distance = %.2lf",distance);
	}else{
		printf("%.2lf",cost);
	}
	return 0;
}
 

 

### NetCDF 文件中数据类型无效或 _FillValue 类型不匹配解决方案 当处理 NetCDF 文件时,如果遇到数据类型无效或 `_FillValue` 类型不匹配的问题,通常是因为定义的数据类型与实际存储的数据类型不符。为了确保一致性并解决问题,可以采取以下措施: #### 验证和调整数据类型 在创建或修改 NetCDF 文件时,务必确认变量声明的数据类型与其对应的 `_FillValue` 的数据类型一致。例如,在 Java 中使用 `netCDF` 库时,可以通过如下方式设置合适的约束条件来验证特征类型的合法性[^1]。 ```java // 创建一个新的特征类型约束对象用于检查有效性 FeatureTypeConstraint constraint = styleFactory.createFeatureTypeConstraint("Feature", Filter.INCLUDE, null); ``` 对于具体的数据类型校验,则应通过编程接口获取当前使用的填充值及其所属类型,并将其转换为目标类型后再赋给相应属性。下面是一个 Python 示例代码片段展示如何操作 netCDF4 模块中的文件以修正此类错误: ```python import numpy as np from netCDF4 import Dataset def fix_fillvalue_type(ncfile_path): with Dataset(ncfile_path, 'r+') as ds: for var_name in ds.variables.keys(): variable = ds[var_name] # 获取原始 FillValue 和 dtype 属性 fill_value = getattr(variable, '_FillValue', None) if isinstance(fill_value, (np.floating)): new_dtype = float elif isinstance(fill_value, (int, np.integer)): new_dtype = int else: continue # 如果现有 dtype 不同于推断的新 dtype 则更新它 current_dtype = variable.dtype.type if not issubclass(current_dtype, new_dtype): print(f'Changing {var_name} from type {current_dtype.__name__} to {new_dtype.__name__}') # 更新变量的 dtype 并重新设定 FillValue delattr(variable, "_FillValue") # 删除旧的 FillValue 属性 variable.setncattr("_FillValue", np.array([fill_value], dtype=new_dtype)[0]) ``` 此函数遍历指定路径下的 NetCDF 文件内的所有变量,针对每个变量判断其 `_FillValue` 是否存在以及是否需要更改关联的数据类型;一旦发现差异即执行必要的更正动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值