PAT A1033 to fill or not to fill(25)

来源:互联网 发布:如何找pdf 知乎 编辑:程序博客网 时间:2024/06/05 15:26

这道题写的我很难受。。。


#include<cstdio>
#include<algorithm>
using namespace std;
int INF=99999;
struct sta{
float price;
float dis;
}stat[505];
int cmp(sta a,sta b){
return a.dis<b.dis;
}
int main(){
int c,d,dav,n,tag=0;
float price=0;
scanf("%d%d%d%d",&c,&d,&dav,&n);
int i;
for(i=0;i<n;i++){
scanf("%f%f",&stat[i].price,&stat[i].dis);
}
sort(stat,stat+n,cmp);
if(stat[0].dis!=0){
printf("The maximum travel distance = 0.00");
return 0;
}
float maxd=0;
int d1=stat[0].dis,d2,leftd=d;
for(i=1;i<n;i++){
d2=stat[i].dis;
if((d2-d1)>(c*dav)){//can't arrive
maxd += c*dav;
tag=1;
break;
}else{
maxd += (d2-d1);
d1=stat[i].dis;
}
}
if(tag==0){
d2=d;
if((d2-d1)>(c*dav)){//can't arrive
maxd += c*dav;
tag=1;
}
}
if(tag==1) printf("The maximum travel distance = %.2f",maxd);
int run = c*dav,k;
float tank=0,minp=INF;
if(tag==0){// count price
i=0;
while(i<n-1){
minp=INF;
for(int j=i+1;j<n && (stat[j].dis-stat[i].dis)<= (c*dav);j++){
if(stat[j].price<minp){
minp=stat[j].price;
k=j;
}
if(stat[j].price<stat[i].price){
k=j;
// add  oil

break;
}
}
if(minp>stat[i].price && (d-stat[i].dis)> (c*dav)){
// add full oil
price += (c-tank)*stat[i].price;
tank=c;
}else if(minp>stat[i].price && (d-stat[i].dis)<= (c*dav)){
price += (d-stat[i].dis-tank*dav)/dav * stat[i].price;
printf("%.2f",price);
return 0;
}

else{
price += (stat[k].dis-stat[i].dis-tank*dav)/dav*stat[i].price;
tank += (stat[k].dis-stat[i].dis-tank*dav)/dav;
}

tank -=(stat[k].dis-stat[i].dis)/dav;//arrive k
i=k;


}
price += (d-stat[i].dis)/dav * stat[i].price;
printf("%.2f",price);
}
return 0;
}

0 0
原创粉丝点击