大概想法是
- 找在可达范围内第一个油价比当前油价低的站点
-
- 开到那里 更新参数
- 如果范围内没有油价更低的站点
-
- 把油加满 并把参数更新到范围内油价最低的站点
第二个点卡了好久 发现是要加一个对起始点是否为0的判断
#include <bits/stdc++.h>
using namespace std;
struct Node{
double price,distance;
bool friend operator <(Node a,Node b){
if(a.distance!=b.distance)return a.distance<b.distance;
else return a.price<b.price;
}
};
vector<Node> nodes;
double cmax,dist,davg;
int n;
int findmin(double currdist, double range, double currprice){
int idx=0,minidx=n-1;
double minval=INT_MAX*1.0;
while(nodes[idx].distance<=currdist)idx++;
while(idx<n&&nodes[idx].distance<=currdist+range){
if(nodes[idx].price<currprice)return idx;
if(nodes[idx].price<minval){
minval=nodes[idx].price;
minidx=idx;
}
idx++;
}
return minidx;
}
int main(){
cin>>cmax>>dist>>davg>>n;
for(int i=0;i<n;i++){
Node node;
cin>> node.price>>node.distance;
if(node.distance<dist)nodes.push_back(node);
}
Node node;
node.price=-1.0,node.distance=dist;
nodes.push_back(node);//final point as a station
sort(nodes.begin(),nodes.end());
n=nodes.size();
double range=cmax*davg,currdist=0.0,currentoil=0.0,totalprice=0.0;
int currnode=0;
//check if can reach final
if(nodes[0].distance!=0){
printf("The maximum travel distance = 0.00");
return 0;
}
for(int i=1;i<n;i++){
if(nodes[i].distance-nodes[i-1].distance>range){
printf("The maximum travel distance = %.2lf",nodes[i-1].distance+range);
return 0;
}
}
while(currnode<n-1){
int minidx=findmin(currdist,range,nodes[currnode].price);
//have less price station in range that can reach
if(nodes[minidx].price<nodes[currnode].price||minidx==n-1){
//add oil enough to this station
totalprice+=nodes[currnode].price*((nodes[minidx].distance-nodes[currnode].distance)/davg-currentoil);
currnode=minidx;
currdist=nodes[minidx].distance;
currentoil=0;
}else{
//add full oil to min station in range;
totalprice+=(cmax-currentoil)*nodes[currnode].price;
currentoil=cmax-(nodes[minidx].distance-nodes[currnode].distance)/davg;
currdist=nodes[minidx].distance;
currnode=minidx;
}
}
printf("%.2lf",totalprice);
}
最后一个25分题,刚开始觉得挺难的不想写,所以一直留到了最后