zoukankan      html  css  js  c++  java
  • 洛谷 P1016 旅行家的预算(贪心+模拟)

    题目链接:https://www.luogu.com.cn/problem/P1016

    贪心的策略是:

    从起点/其中一个加油站出发,所能到达的所有加油站中,如果有比当前加油站价格便宜的,则从当前加油站加定量油正好跑到那个最近的价格便宜的加油站;如果都比当前加油站贵,则加满油并跑到价格最低的一个。

    再注意一些边界条件的处理。

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 const int N=10;
     5 double d1,c,d2,pp,len;
     6 int n;
     7 bool flag;
     8 double d[N],p[N];
     9 void DFS(int pos,double left,double cost,int pre){
    10     if(pos==n+1){ printf("%.2lf",cost-left*p[pre]); flag=1; return;}
    11     double _len=len+d[pos];
    12     for(int i=pos+1;i<=n+1&&d[i]<=_len;i++){
    13         if(p[i]<=p[pos]) { DFS(i,left,cost+double(d[i]-d[pos])/d2*p[pos],pos); return;}
    14     }
    15     if(pos+1<=n+1&&d[pos+1]<=_len){
    16         int _pos=pos+1;
    17         for(int i=pos+1;i<=n+1&&d[i]<=_len;i++){
    18             if(p[i]<p[_pos]) _pos=i;
    19         }
    20         DFS(_pos,c-(d[_pos]-d[pos])/d2,cost+double(c-left)*p[pos],pos);
    21         return;
    22     }
    23 }
    24 int main(){
    25     scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&pp,&n);
    26     for(int i=1;i<=n;i++) scanf("%lf%lf",&d[i],&p[i]);
    27     len=c*d2;
    28     d[n+1]=d1;
    29     p[0]=pp;
    30     DFS(0,0,0,0);
    31     if(!flag) printf("No Solution");
    32     return 0;
    33 }
    AC代码
  • 相关阅读:
    NUnit使用笔记2-GetStarted
    NUnit使用笔记1-下载与安装
    2014年的总结
    2015-02-10
    2015-02-03
    一些书
    SQLServer 安装提示需要重启计算机的解决方案
    ArcSDE
    plsql更改用户登录密码
    Oracle创建表空间和用户
  • 原文地址:https://www.cnblogs.com/New-ljx/p/13619312.html
Copyright © 2011-2022 走看看