大佬求看
查看原帖
大佬求看
1008115
cinemaaa楼主2023/10/30 14:38
#include<bits/stdc++.h>
using namespace std;
int n,d;

const int maxn = 100010;

int v[maxn],b[maxn],f,f1;
double f2;//站点距离和油价  f:记录到了哪个站点  f2:记录当前站点油价 

void read(){
	for(int i = 0; i < n-1; i++) cin>>v[i];
	for(int i = 0; i < n; i++) cin>>b[i];
	f1 = b[0];
}

int find(int p[]){//用于寻找这个站点往后的第一个油价比它少的站点
	 for(int i = f; i < n-1; i++){
	 	if(p[i] < f1){
	 		return i;
		 }
	 }
	 return -1;
}

using namespace std;
int main()
{
//	freopen("road.in","r",stdin);
//	freopen("road.out","w",stdout);
	cin>>n>>d;
	read();
	f1 = b[0];
	if(find(b) == -1){//若第一个站点为最低价,直接走到终点 
		int s = 0;
		for(int i = 0; i < n-1; i++) s+=v[i];
		s = ceil(s*1.0/d);
		cout<<s*b[0];
		return 0;
	}
	int sum = 0;
	while(f!=n){
		int s = 0;
		if(find(b) == -1){//若此站点为最低价,直接走到终点 
			for(int i = f; i < n-1; i++) s+=v[i];
				s -= floor(1.0*f2*d);
				s = ceil(s*1.0/d);
				cout<<sum+s*b[f];
			return 0;
		}
		for(int i = f; i <= find(b); i++) s+=v[i];
		s -= floor(1.0*f2*d);
		s = ceil(s*1.0/d);
		sum += s*b[f];
		f1 = b[f];
		f2 = s - (v[f]/d*1.0);
		f = find(b);
	}
	cout<<sum;
}

这个代码的贪心法看看能不能行(0pts,如果思路正确那就是我小数的问题)

2023/10/30 14:38
加载中...