求助大佬,P1016求调
查看原帖
求助大佬,P1016求调
631896
Wangtsjo楼主2022/10/28 20:13

贪心

样例输出 33.32

感谢大佬

#include<bits/stdc++.h>
using namespace std;
typedef double dou;
dou c,d1,d2;//同题意 
dou dis;//油箱满时能行驶的距离 
dou ans=0.0;
int n;
dou nc=0.0;//现在油量 
struct node{
	dou d,w;
}e[12];
bool cmp(node A,node B){
	return A.d<B.d;
}
int main(){
	cin>>d1>>c>>d2>>e[0].w>>n;
	dis=c*d2;
	e[0].d=0;
	for(int i=1;i<=n;i++) {
		cin>>e[1].d>>e[1].w;
	}
	e[n+1].d=d1;
	sort(e,e+n+2,cmp);
	for(int i=0;i<=n;i++){
		if(dis<e[i+1].d-e[i].d) {
			printf("No Solution");return 0;//判断是否可到达
		} 
	}
	for(int i=0;i<=n;){
		dou np=e[i].w;
		int pl=i;
		for(int j=i+1;e[j].d-e[i].d<=dis;j++){
			if(np<=e[j].w){
				np=e[j].w;pl=j;
			}
		}
		if(pl!=i){
			if(nc*d2<=e[pl].d-e[i].d)
				ans+=(((dou)(e[pl].d-e[i].d)/d2)-nc)*e[i].w;
			nc=0.0;i=pl;
		}
		else{
			ans+=((c-nc)*e[i].w);nc=c;
			for(int j=i+1;e[j].d-e[i].d<=dis;j++){
				pl=j;
			}
			i=pl;nc-=((dou)(e[pl].d-e[i].d)/d2);			
		}
	//	if(nc*d2<e[n+1].d-e[n].d) ans+=((dou)(e[n+1].d-e[n].d)/d2)*e[n].w;
	}
	if(nc*d2<e[n+1].d-e[n].d) ans+=((dou)(e[n+1].d-e[n].d)/d2)*e[n].w;
	printf("%.2lf",ans);
	return 0;
}
2022/10/28 20:13
加载中...