P1016 旅行家的预算

题面:https://www.luogu.org/problem/P1016

本题直接贪心之后dfs即可,注意dfs要讨论两种情况.
Code:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<ctime>
using namespace std;
const int N=10005;
int n,f;
double ans=100000000.00,d1,c,d2,d[N],p[N],dis[N];
void dfs(int now,double oil,double cost){
    if(now==n+1){
        if(cost<ans){
			ans=cost;
		}
        f=1;
        return;
    }
    if(c*d2<dis[now]){
		return;
	}
    double nd=0.00;
    for(int i=now;i<=n;i++){
        nd+=dis[i];
        if(d2*c<nd){
			break;
		}
        dfs(i+1,c-nd/d2,cost+p[now]*(c-oil));
        dfs(i+1,0.00,cost+max(0.00,p[now]*nd/d2-p[now]*oil));
    }
    return;
}
int main(){
   scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p[0],&n);
    for(int i=1;i<=n;i++){
        scanf("%lf%lf",&d[i],&p[i]);
        dis[i-1]=d[i]-d[i-1];
    }
    dis[n]=d1-d[n];
    dfs(0,0.00,0.00);
    if(f){
        printf("%.2lf\n",ans);
    }
    else{
		printf("No Solution\n");
	}
    return 0;
}
posted @ 2019-09-08 12:54  prestige  阅读(145)  评论(0编辑  收藏  举报