社区讨论

第5测试点错了 大佬看看吧!

P1016[NOIP 1999 普及组/提高组] 旅行家的预算参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m5scb2cd
此快照首次捕获于
2025/01/11 23:27
去年
此快照最后确认于
2025/11/04 11:44
4 个月前
查看原帖
求求了看看吧第5测试点错了
CPP
#include<bits/stdc++.h>
using namespace std;
struct pp{
	double d,p;//结构体
}a[10];
double km,c,kml,m,ans; 
int n;
bool cmp(pp qqq,pp www){
	return qqq.d<www.d;//结构体排序
}
int main(){
	cin>>km>>c>>kml>>m>>n;
	a[0].d=0;
	a[0].p=m;
	a[n+1].d=km;
	a[n+1].p=0;//初始化,把单独数据归入整体
	for(int i=1;i<=n;i++){
		cin>>a[i].d>>a[i].p;
	}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n+1;i++){
		if(a[i].d-a[i-1].d>c*1.0*kml){
			cout<<"No Solution";
			return 0;
		}
		
	}
	int sum=0;//上次标记的加油站
	double sum1=m,sum2=0;//sum点的油价,sum离起点多少km 
	for(int i=1;i<=n+1;i++){
		if(a[i+1].d-sum2>c*1.0*kml){//如果走不到下个加油站
			ans+=a[sum].p*1.0*((a[i].d-sum2)/kml);//加的钱数
			sum=i;
			sum1=a[i].p;
			sum2=a[i].d;//标记这个点
			continue;
		}
		if(a[i].p<=sum1){//如果比上个标记的加油站便宜
			ans+=a[sum].p*1.0*((a[i].d-sum2)/kml);//加的钱数
			sum=i;
			sum1=a[i].p;
			sum2=a[i].d;//标记这个加油站
		}
	}
	printf("%.2lf",ans);//输出
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...