算法笔记 PAT A1033 贪心算法 (好题 重点)

#include
#include
#include
#include
#include
//贪心策略:
//如果在当前加油站可以行驶的最远距离之内
//1 若其中的加油站价格都比当前的贵 加满油去价格最低的
//2 若有比当前便宜的 优先去第一个便宜的
//3 若加满油都找不到可以到的下一个加油站 则无法到达
//注意:第一个加油站一定在起点,终点是价格为0的加油站,保持优先性最高
using namespace std;
struct node
{
double dis,price;//注意用double类型
}dis[510];
bool cmp(node a,node b)
{
return a.dis }
int n,k;
double ans;
double D,cmax,Davg;//终点距离,油箱容量,单位油能走的距离
int main()
{
cin>>cmax>>D>>Davg>>n;
for(int i=0;i cin>>dis[i].price>>dis[i].dis;
dis[n].dis=D;//为终点初始化 终点是最后一个零价格的加油站
dis[n].price=0;
sort(dis,dis+n,cmp);
if(dis[0].dis!=0)
cout<<“The maximum travel distance = 0.00\n”;
else{
double nowtank=0;
double max=cmax*Davg;//初始化
int now=0;
while(now {
k=-1;//k用来标记接下来去哪个加油站
double pricemin=1e9;//最低油价
//对接下来是三种中的哪种状态判断
for(int i=now+1;i<=n&&dis[i].dis-dis[now].dis<=max;i++)//在可达距离内寻找
{

             if(dis[i].pricenowtank)
            {
              ans+=dis[now].price*(need-nowtank);
              nowtank=0;
            }
            else
            {
               nowtank-=need;
            }
         }
         else//如果全是更贵的
         {
            ans+=(cmax-nowtank)*dis[now].price;
            nowtank=cmax-need;
         }
         now=k;
     }
     if(now==n) printf("%.2f\n",ans);
     else printf("The maximum travel distance = %.2f\n",dis[now].dis+max);
}
return 0;

}

你可能感兴趣的:(算法笔记入门篇:模拟,贪心,二分,散列,递归,排序)