7-7 To Fill or Not to Fill (30 分)

本文介绍了一个算法,用于解决从杭州出发到任意城市驾驶汽车时,考虑到油箱容量限制和沿途加油站不同油价的情况,如何设计最经济的行车路线。输入包括油箱最大容量、目的地距离、平均油耗和加油站信息,输出是最便宜的总花费或无法到达目的地时的最大可行距离。

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

With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way from time to time. Different gas station may give different price. You are asked to carefully design the cheapest route to go.

Input Specification:

Each input file contains one test case. For each case, the first line contains 4 positive numbers: C​max​​ (≤ 100), the maximum capacity of the tank; D (≤30000), the distance between Hangzhou and the destination city; D​avg​​ (≤20), the average distance per unit gas that the car can run; and N (≤ 500), the total number of gas stations. Then N lines follow, each contains a pair of non-negative numbers: P​i​​, the unit gas price, and D​i​​ (≤D), the distance between this station and Hangzhou, for i=1,⋯,N. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the cheapest price in a line, accurate up to 2 decimal places. It is assumed that the tank is empty at the beginning. If it is impossible to reach the destination, print The maximum travel distance = X where X is the maximum possible distance the car can run, accurate up to 2 decimal places.

Sample Input 1:

50 1300 12 8
6.00 1250
7.00 600
7.00 150
7.10 0
7.20 200
7.50 400
7.30 1000
6.85 300

Sample Output 1:

749.17

Sample Input 2:

50 1300 12 2
7.10 0
7.00 600

Sample Output 2:

The maximum travel distance = 1200.00
/**7-7 To Fill or Not to Fill (30 分)*/
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

typedef struct node{
    double v;
    int d;
}node;

bool cmp(const node &n,const node &m){
    return n.d<m.d;
}
int main(){
    int c,x,y,n;
    double oil=0,money=0;
    scanf("%d %d %d %d",&c,&x,&y,&n);
    int maxd = c*y;
    int k=0;
    node *a = (node*)malloc((n+1)*sizeof(node));
    for(int i=0;i<n;i++){
        scanf("%lf %d",&a[i].v,&a[i].d);
    }
    a[n].v=0,a[n].d=x;
    sort(a,a+n,cmp);
//    for(int i=0;i<n;i++)
//        cout<<a[i].v<<" "<<a[i].d<<endl;
    if(a[0].d!=0){
        printf("The maximum travel distance = 0.00");
        return 0;
    }
    while(1){
		int st=k;
		if(a[st+1].d-a[k].d>maxd){/**如果两站之间的距离大于可以行驶的距离*/
			if(x-a[k].d<=maxd){/**if终点到此时的站的距离<=最大距离,直接行使到终点*/
				money +=(x-a[k].d-oil)*a[k].v;
				printf("%.2f",(money)*1.0/y*1.0);
				return 0;
			}
			else{/**即到不了下一站也到不了终点,加满油行驶最大距离*/
				printf("The maximum travel distance = %.2f",(a[k].d+maxd*1.0));
				return 0;
			}
		}
		while(st<n && a[++st].d-a[k].d<=maxd){/**遍历每一个站,if本站到下一站的距离<=可行驶的最大距离时
                                                ,我们就可以继续判断如何向终点行驶*/
			if(a[st].v<a[k].v){ /**if下一站站价钱比当前的站便宜,那么就过去,但是要根据此时的剩余油量可行驶的距离来判断*/
				if(oil>=(a[st].d-a[k].d))/**if此时剩余油量可行驶的距离 >= 两站之间的距离就过去*/
				oil-=a[st].d-a[k].d;
				else{/**如果此时剩余油量可行驶的距离 < 两站之间的距离就不过去*/
				money+=(a[st].d-a[k].d-oil)*a[k].v; /**那么肯定要花钱加油了,加的油量时正好到下一个站的*/
				oil=0;
				}
				k=st;
				break;
			}
		}
		if(a[st].d-a[k].d>maxd){
			money+=(maxd-oil)*a[k].v;
			oil=maxd-(a[st-1].d-a[k].d);
			k=st-1;
        }
	}
	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、付费专栏及课程。

余额充值