【NOIP1999】【Codevs 1046】旅行家的预算

http://codevs.cn/problem/1046/

Solution:

贪心,如果当前油价很低,它就比起当前剩余油的价还低就可以替换,并且每次加满,最后把剩的油卖掉即可

油价用单调链表(不知到为什么会写链表,脑抽,当时觉得插入方便,其实不用插入。。。尴尬)维护 or 堆(你也可以脑抽,加个log),没事啦,数据水

// <travel.cpp> - 06/23/16 12:55:15
// This file is made by YJinpeng,created by XuYike‘s black technology automatically.
// Copyright (C) 2016 ChangJun High School, Inc.
// I don‘t know what this program is.

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define MOD 1000000007
#define INF 1e9
using namespace std;
typedef long long LL;
const int MAXN=100010;
const int MAXM=100010;
inline int max(int &x,int &y) {return x>y?x:y;}
inline int min(int &x,int &y) {return x<y?x:y;}
inline int getint() {
	register int w=0,q=0;register char ch=getchar();
	while((ch<‘0‘||ch>‘9‘)&&ch!=‘-‘)ch=getchar();
	if(ch==‘-‘)q=1,ch=getchar();
	while(ch>=‘0‘&&ch<=‘9‘)w=w*10+ch-‘0‘,ch=getchar();
	return q?-w:w;
}
struct Edge{
    double p,q;
    Edge* next;
};
double d[MAXN],c[MAXN],D,C,V,w[MAXN],ans,k;
int n;
int main()
{
	freopen("travel.in","r",stdin);
	freopen("travel.out","w",stdout);
    scanf("%lf %lf %lf %lf",&D,&C,&V,&w[1]);
    n=getint()+1;
    for(int i=2;i<=n;i++)scanf("%lf %lf",&d[i],&w[i]);
    d[n+1]=D;
    for(int i=1;i<=n;i++)c[i]=(d[i+1]-d[i])/V;
    Edge* root=new Edge;
    Edge* now;Edge* the;
    ans=0;c[0]=C;root->next=NULL;
    for(int i=1;i<=n;i++){
        if(c[i]>C){printf("No Solution");return 0;}
        now=root;
        while(now->next!=NULL){the=now->next;if(the->q>w[i])break;now=now->next;}
        k=c[i-1];the=now;
        while(the->next)the=the->next,k+=the->p,ans-=the->p*the->q;
        the=new Edge;
        the->next=NULL;
        the->p=k;the->q=w[i];
        now->next=the;now=root->next;
        ans+=k*w[i];
        k=c[i];
        while(k>0){
            if(k<now->p){now->p-=k;break;}
            k-=now->p;
            now=now->next;
        }
        root->next=now;
    }
    while(root->next){root=root->next;ans-=root->p*root->q;}
    printf("%.2lf",ans);
	return 0;
}

  

时间: 2024-10-09 20:46:07

【NOIP1999】【Codevs 1046】旅行家的预算的相关文章

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; //每升汽油能行驶

蓝桥杯 算法训练 ALGO-15 旅行家的预算

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

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行,两个数

分治:旅行家的预算(travel)

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

[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

NOIP1999 旅行家的预算

题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离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

旅行家的预算 1999年NOIP全国联赛普及组NOIP全国联赛提高组

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

洛谷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】旅行家的预算

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