http://blog.csdn.net/lv_zj/article/details/16115569
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
class CA
{
public:
class cstation
{
public:
int point,addlen;
double price;
cstation(){point=0;addlen=0;price=0;}
bool operator < (const cstation& st)const
{
return point<st.point;
}
};
void run();
int c,d,avg,n;
vector<cstation> vst;
};
void CA::run()
{
cin>>c>>d>>avg>>n;
cstation st;
while(n-->0)
{
cin>>st.price>>st.point;
vst.push_back(st);
}
sort(vst.begin(),vst.end());
int taglen=c*avg;
int i,j,lastlevlen=0,lastpoint=0;
vector<int> curlist;
bool gotto=false;
for(i=0;i<vst.size();i++)
{
if(vst[i].point-lastpoint>lastlevlen) break;
lastlevlen-=vst[i].point-lastpoint;
int k=i;
for(j=i+1;j<vst.size();j++) //find first sheapest station
{
if(vst[j].point-vst[i].point<=taglen)
{
if(vst[j].price<vst[k].price) {k=j;break;}
}
else break;
}
if(k==i) vst[i].addlen=taglen-lastlevlen; //current station is sheapest ,fill tank
else vst[i].addlen=(vst[k].point-vst[i].point-lastlevlen)>0?(vst[k].point-vst[i].point-lastlevlen):0; //rearch the lastest cheaper station
lastpoint=vst[i].point;
lastlevlen+=vst[i].addlen;
if(vst[i].point+lastlevlen>=d)
{
vst[i].addlen-=vst[i].point+lastlevlen-d;
gotto=true;
break;
}
}
if(gotto)
{
double allprice=0;
for(i=0;i<vst.size();i++)
{
allprice+=vst[i].addlen*vst[i].price/avg;
}
printf("%.2f",allprice);
}
else
{
printf("The maximum travel distance = %.2f",double(lastpoint+lastlevlen));
}
}
int main()
{
// freopen("test.in","r",stdin);
CA *a=new CA;
a->run();
return 0;
}
我自己的程序
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class CA
{
public:
enum{CMAX=100,DIS=30000,DAVG=20,N=501};
void run();
void find(int id);
public:
int n;
double c,d,davg;
int custid;
double needgas,cugas,totalprice;
struct station
{
double gasprice;
int distance;
bool operator < (const station& a) const
{
return distance<a.distance;
}
};
vector<station> st;
};
void CA::find(int id)
{
if(id==n)
{
printf("%0.2f",totalprice);
return;
}
if(st[id+1].distance-st[id].distance>c*davg)
{
printf("The maximum travel distance = %.2f",(st[id].distance+c*davg));
return;
}
int i,tmpid,tmpidcu;
double tt=st[id+1].gasprice;
double ttcu=st[id].gasprice;
tmpidcu=id;
tmpid=id+1;
/*int k=n;
for(i=id;i<=n;i++)
{
if(st[i].distance>c*davg+st[id].distance)
{
k=i;
break;
}
}*/
for(i=id+1;i<=n;i++)//cmax内有
{
if(st[i].distance>c*davg+st[id].distance)
break;
if(st[id].gasprice<tt)
{
tt=st[i].gasprice;
tmpid=i;
}
}
int flag=-1;
for(i=1;(st[id+i].distance-st[id].distance)<cugas*davg;i++)//cugas内,有
{
if(st[id+i].gasprice<ttcu)
{
ttcu=st[id+i].gasprice;
tmpidcu=id+i;
flag=1;
}
}
int idzuijin;
double tmpidzuijin;
for(i=1;i<=n;i++)
{
if(st[id].gasprice>st[i].gasprice)
{
idzuijin=i;
tmpidzuijin=st[id].gasprice;
break;
}
}
if(flag==1&&st[id].gasprice>tt)
{
printf("1\n");
cugas=cugas-(st[tmpidcu].distance-st[id].distance)/davg;
id=tmpidcu;
find(id);
}
else if(flag==-1&&st[id].gasprice>tt)
{
printf("2\n");
totalprice+=((st[tmpidzuijin].distance-st[id].distance)/davg-cugas)*st[id].gasprice;
cugas=0;
id=tmpidzuijin;
find(id);
}
else
{
printf("3\n");
cugas=c;
totalprice+=(c-cugas)*davg;
id=tmpid;
find(id);
}
}
void CA::run()
{
double v1;
int i,v2;
cin>>c>>d>>davg>>n;
for(i=0;i<n;i++)
{
station tmpst;
cin>>v1>>v2;
tmpst.gasprice=v1;tmpst.distance=v2;
st.push_back(tmpst);
}
station tmpst;
tmpst.gasprice=0;tmpst.distance=d;
st.push_back(tmpst);
sort(st.begin(),st.end());
for(i=0;i<=n;i++)
{
printf("%.2f %d\n",st[i].gasprice,st[i].distance);
}
cugas=0;
totalprice=0;
find(0);
}
int main()
{
freopen("test.txt","r",stdin);
CA *a=new CA;
a->run();
return 0;
}