1033 . To Fill or Not to Fill (25) (想明白了没写出来,参考吧)

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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值