洛谷P1016 旅行家的预算 贪心

这道题就是贪心
1、在第一个加油站的时候,如果在加满油能够到达的加油站中有一个加油站的钱比自己的少(其实等于也行),那就 加足够到那个车站的油,直接去那个车站
2、这些车站中所有都比自己大,那就找一个其中钱最少的车站 在当前车站加满油,然后直接开到那个车站
3、然后到达车站时就不断重复以上的处理方法
4、但这样有一个问题就是你无法到达最后一个车站,于是我们把最后一个车站的费用变为0(其实还是-1更保险)这样就保证如果能到,就一定能走到最后一个
车站
5、那么如何判断能否到达呢?如果在一次加油站处理操作时,发现加满油了仍然一个车站都不能到达,那就不能到达了。

下面贴代码,感觉自己写的好丑啊

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstdlib>
#include <algorithm>
using namespace std ;

struct node{
    double wei,p ;
};

double d1,c,d2,you,w ;
double ans ;
int n,x,k;
double y,mi ;
node a[1000011] ;
bool f,ff ;

bool cmp(node a,node b)
{
    return a.wei<b.wei ;
}

int main()
{
    scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&a[0].p,&n) ;
    a[0].wei = 0 ;
    for(int i=1;i<=n;i++)
    {
        scanf("%lf%lf",&a[i].wei,&a[i].p) ;
    }
    sort(a+1,a+n+1,cmp) ;
    a[++n].wei = d1 ;
    a[n].p = 0 ;
    x = 0 ;
    while(x<n)
    {
        mi = 1000000000 ;
        y = a[x].wei + d2*c ;
        f = false ;  ff = false ;
        for(int i=x+1;x<=n&&a[i].wei<=y;i++)
        {
            f = true ;
            if(a[i].p<=a[x].p)          //   等于应该也开的吧
            {
                k = i ;
                w=(a[i].wei-a[x].wei)/d2 ;
                if(you>=w)
                {
                    you-=w ;
                }
                else
                {
                    ans=ans+(w-you)*a[x].p ;
                    you = 0 ;
                }
                x = i ;
                ff = true ;
                break ;
            }
            if(a[i].p<mi) mi = a[ i ].p,k = i ;
        }
        if(ff) continue ;
        if(!f)
        {
            printf("No Solution\n") ;
            return 0 ;
        }
        ans = ans + (c-you) *a[x].p ;
        you = c - (a[k].wei-a[x].wei) /d2 ;
        x = k ;
    }
    printf("%.2lf",ans) ;
    return 0 ;
}
时间: 2024-10-05 06:16:20

洛谷P1016 旅行家的预算 贪心的相关文章

[NOIP1999] 提高组 洛谷P1016 旅行家的预算

题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格Pi(i=1,2,…,N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出“No Solution”. 输入输出格式 输入格式: 第一行,D1,C,D2,P,N. 接下来有N行. 第i+1行,两个数字,油站i离出发点的距离D

洛谷1016 旅行家的预算

题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格Pi(i=1,2,-,N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出"No Solution". 输入输出格式 输入格式: 第一行,D1,C,D2,P,N. 接下来有N行. 第i+1行,两个数字,油站i离出发

P1016 旅行家的预算

P1016 旅行家的预算 题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿途油站数N(N可以为零),油站i离出发点的距离Di.每升汽油价格Pi(i=1,2,…,N).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出“No Solution”. 输入输出格式 输入格式: 第一行,D1,C,D2,P,N. 接下来有N行. 第i+1行,两个数

洛谷P1080 国王游戏 高精度 贪心 数学推公式

洛谷P1080 国王游戏        数学推公式      高精度    贪心 然而这并不是我打出来的,抄题解... 将左手与右手的乘积从小到大排序,然后计算求最大值即可.(需要高精度) 证明: 1)知道,如果相邻的两个人交换位置,只会影响到这两个人的值,不会影响他人 2)假设相邻的两个人i, i + 1.设A[i] B[i] <= A[i + 1] B[i + 1],i之前所有人的左手乘积为S. 则,ans1 = max{S / B[i], S * A[i] / B[i + 1]} 若交换

p1016旅行家的预算

题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离 D1D1 .汽车油箱的容量 CC (以升为单位).每升汽油能行驶的距离 D2D2 .出发点每升汽油价格 PP 和沿途油站数 NN ( NN 可以为零),油站 ii 离出发点的距离 DiDi .每升汽油价格 PiPi ( i=1,2,-,Ni=1,2,-,N ).计算结果四舍五入至小数点后两位.如果无法到达目的地,则输出"No Solution". 输入输出格式 输入格式:

D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]

题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个问题: 数轴上有个点突然兴奋,如果自己被身上覆盖了超过条线段,这个点就会浑身难受然后把Koishi批判一番. Koishi十分善良,为了不让数轴上的点浑身难受,也为了让自己开心,她想在数轴上放入尽量多的线段. 按照套路,Koishi假装自己并不会做这道题,所以她就来求你帮忙.并承诺如果你解决了问题就

洛谷 P1056 排座椅【贪心/结构体排序】

题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳.同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道.于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么

洛谷 P1094 纪念品分组【贪心/双指针】

题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. 输入输出格式 输入格式: 输入文件group.in包含n+2行: 第1行包括一个整数w,为每组纪念品价格之和的上上限. 第

Codevs 1046 旅行家的预算 贪心

#include <iostream> #include <algorithm> #include <cstdlib> #include <cstdio> #include <queue> using namespace std; const int maxn = 100 + 30; const int INF = 999999999; double D1; //两地之间距离 D1 double C, //汽车容量 C D2; //每升汽油能行驶