`
java-mans
  • 浏览: 11438724 次
文章分类
社区版块
存档分类
最新评论

汽车加油行驶问题

 
阅读更多

http://poj.org/problem?id=2431Expedition

/*
n个加油站,,邮箱容量不限,,,,每个加油站可加的油量有限,,,求最少的加油次数
因为邮箱容量不限,,,可以这样贪心,,,如果邮箱的油能到达下一站,,则直接到达下一站,,否则,,,从已经走过的加油站中选择油量最多的站加一次油
*/
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdio>
using namespace std;

struct Node
{
	int distance,fuel;  //定义一个优先队列
	friend bool operator<(Node a, Node b)
	{     //从小到大排序采用“>”号;如果要从大到小排序,则采用“<”号
		return a.fuel < b.fuel;       //从大到小排序
	}
}node[10001];

bool cmp(const Node &a,const Node &b)
{
	return a.distance < b.distance;
}
void Solve(int n,int L,int P)
{
	int i=0,j=P,ans=0;
	priority_queue<Node>q;  //用优先队列来维护一个按照加油站油量从大到小来排序
	Node temp;
	while(node[i].distance<0)
		i++;
	while(i < n && j < L)
	{
		while(i < n && node[i].distance <= j)   //有油的时候能走多远就走多远
		{
			q.push(node[i]);
			++i;
		}
		if(q.empty())
			break;
		temp = q.top();
		q.pop();
		j += temp.fuel;   //如果走不到,就必须要加一次油,途中会遇到很多加油站,一定要选择油最多的那个加油站
		ans++;
	}
	if(j < L)
		printf("-1\n");
	else
		printf("%d\n",ans);
}
int main(void)
{
    int i,n,L,P;
	while (scanf("%d",&n)!=EOF)
	{
		sort(node,node+n,cmp);
		for (i = 0; i < n; ++i)
			scanf("%d %d",&node[i].distance,&node[i].fuel);
		scanf("%d %d",&L,&P);
		for (i = 0; i < n; ++i)
			node[i].distance = L - node[i].distance;   //当前位置跟加油站之间的距离
		sort(node,node+n,cmp);
		Solve(n,L,P);
	}
	return 0;
}

http://poj.org/problem?id=2465Adventures in Moving - Part IV

/*
题意:有一辆车要从起点0,到终点L处,中间有若干个加油站,给出车的油箱容量200,每行驶1km耗油1L。给出加油站的坐标,以及每个加油站的油价。一开始油箱里有100L的油,到达终点时必须还有100L的油,求最少花多少钱在加油上
分析:DP。F[i,j]表示到达第i个加油站有油j升的最优值,到达一个加油站时,枚举加多少油就好了
*/
//汽车油箱为200,初始油箱内只有100,当到达目的地时,油箱内的油>=100

#include<iostream>
#include<cstdio>
using namespace std;
#include<memory.h>

#define INF 1061109567

inline int min(int a,int b)
{
	if(a<b)
		return a;
	else
		return b;
}

int dist[103],price[103];
int dp[103][203];  //dp[i][j]表示到达地i个加油站,还剩下j油量的最少代价

int main(void)
{
	int i,j,k,n,len,d,p,m,ans;
	scanf("%d",&len);
	n=0;
	while(scanf("%d %d",&d,&p) != EOF)
	{
		dist[n] = d;
		price[n++] = p;
	}
	dist[n] = len;
	price[n++] = INF;
	memset(dp,0x3f3f3f,sizeof(dp));

	dp[0][100-dist[0]] = 0;
	for(i = 0 ; i < n - 1 ; ++i)
	{
		for(j = 0 ; j <= 200 ; ++j)
		{
			if(dp[i][j] == INF)
				continue;
			for(k = 0 ; k+j <= 200 ; ++k)
			{
				m = k + j - (dist[i+1] - dist[i]);
				if(m < 0 )
					continue;
				dp[i+1][m] = min(dp[i+1][m],dp[i][j] + k*price[i] );
			}
		}
	}
	ans = INF;
	for(i = 100 ; i <= 200 ; ++i)
	{
		if(dp[n-1][i] < ans)
			ans = dp[n-1][i];
	}
	if(ans == INF)
		puts("Impossible");
	else
		printf("%d\n",ans);
	return 0;
}

http://pat.zju.edu.cn/contests/pat-practise/1033 To Fill or Not to Fill

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
  
struct Node
{
	double price;
	double length;
}node[502];
bool cmp(const Node &a,const Node &b)
{
	return a.length<b.length;
}
double  capacity , dist ;
int unit_gas ,n;

int main(void)
{
    int i,j,m,index;
	double sum,len,cur_capacity,min_price;
	bool flag;
	while (scanf("%lf %lf %d %d",&capacity,&dist,&unit_gas,&n)!=EOF)
	{
		len = capacity*unit_gas;
		for (i = 0; i < n; ++i)
			scanf("%lf %lf",&node[i].price,&node[i].length);
		sort(node,node+n,cmp);
		node[n].price = 0;
		node[n].length = dist;

		if(node[0].length>0)
		{
			printf("The maximum travel distance = 0.00\n");
			continue;
		}
		else
		{
			flag = false;
			cur_capacity = 0;
			sum = 0;
			for( i = 0 ; i < n ;)
			{
				if(node[i+1].length - node[i].length > len)    //某两个油站之间的距离大于汽车油箱装满油量的最大行程
				{
					flag = true;
					printf("The maximum travel distance = %.2lf\n",node[i].length + len);
					break;
				}
				else
				{
					index = i;
					min_price = node[i].price;
					//找出当前油箱里的油能到达的所有加油站里,油价最便宜的那个
					for(j = i + 1 ; node[j].length - node[i].length <= cur_capacity*unit_gas && j <= n ; j++)
					{
						if(node[j].price < min_price)
						{
							min_price = node[j].price;
							index = j;
						}
					}
					if(index != i)
					{
						cur_capacity -= (node[index].length - node[i].length)/unit_gas;
						i = index;
						continue;
					}
					//若找不到,找出最近的一个能到达的比当前油价便宜的站,加一些油,跑到那个站
					index = i;
					for(j = i + 1 ; node[j].length - node[i].length <= len && j <= n ; j++)
					{
						if(node[j].price < node[i].price)
						{
							index = j;
							break;
						}
					}
					if(index != i)
					{
						sum += ((node[index].length - node[i].length)/unit_gas - cur_capacity)*node[i].price;
						cur_capacity = 0;
						i = index;
						continue;
					}
					//找不到比当前油站的价格还便宜的油站的时候
					//在当前油站需要加满油,跑到能跑到的所有站里油价最小的那个油站
					index = i;
					min_price = 1e18;
					for(j = i + 1 ; node[j].length - node[i].length <= len && j <= n ; j++)
					{
						if(node[j].price < min_price)
						{
							min_price = node[j].price;
							index = j;
						}
					}
					sum += (capacity-cur_capacity)*node[i].price;
					cur_capacity = capacity - (node[index].length - node[i].length )/unit_gas;
					i = index;
				}//else
			}//for
		}//else
		if(!flag)
			printf("%.2lf\n",sum);
	}
	return 0;
}


分享到:
评论

相关推荐

    汽车加油行驶问题(C语言算法设计与分析)

    汽车加油行驶问题(C语言算法设计与分析),里面有完整的代码,并且能正确运行,附带有完整的课程设计说明书。

    汽车加油行驶问题 (算法设计与分析)

    在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守 如下规则: (1)汽车只能沿网格边行驶,装满油后能行驶K 条网格边。出发时汽车已装满油,在 起点与终点处不设油库。 (2)当...

    汽车加油行驶问题 C++算法实现

    在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则: (1)汽车只能沿网格边行驶,装满油后能行驶K 条网格边。出发时汽车已装满油,在起点与终点处不设油库。 (2)当汽车...

    汽车加油行驶问题-动态规划(代码简明 有详细注释).cpp

    在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则: (1)汽车只能沿网格边行驶,装满油后能行驶K条网格边。出发时汽车已装满油,在起点与终点处不设油库。 (2)当...

    汽车加油行驶问题源代码

    汽车加油行驶问题源代码:采用动态规划解决此题。用三维数组v[i][j][t]表示汽车到位置[i][j]且还剩下t步可走的最小费用......

    实现3-7汽车加油行驶问题.cpp

    实现3-7汽车加油行驶问题.cpp

    汽车加油行驶问题课程设计

    本课程设计详尽地描述了用贪吃算法解决汽车加油问题,通过对c语言的运用,求得在行驶过程中满足题意的最优解,通过对时间复杂的分析,可以看出此算法较容易实现

    算法王晓东3-10汽车加油行驶问题完全解决

    在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则: (1)汽车只能沿网格边行驶,装满油后能行驶K条网格边。出发时汽车已装满油,在起点与终点处不设油库。 (2)当...

    汽车加油问题 算法设计

    一辆汽车加满油后可以行驶N千米。旅途中有若干个加油站。指出若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。

    汽车最少费用加油行驶 ACM题目的作业

    Problem D:汽车最少费用加油行驶 Description 给定一个 N*N 的方形网格, 设其左上角坐标为 (1, 1), X 轴向右为正, Y 轴向下为正, 每个方格边长为 1, 右下角坐标为 (N, N). 一辆已装满油的汽车从 (1, 1) 为起点...

    算法分析之汽车加油问题

    算法分析中的汽车加油问题源代码,可供大家参考

    算法分析汽车加油问题

    每个测试用例输入数据的第一行有2 个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已...

    汽车加油问题 动态规划

    在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在行驶过程中应遵守如下规则:  (1)汽车只能沿网格边行驶,装满油后能行驶K 条网格边。出发时汽车已装满油,在起点与终点处不设油库。  (2)汽车...

    JAVA实现汽车加油问题

    第一行有 2 个正整数n和 k(k),表示汽车加满油后可行驶n公里,且旅途中有 k个加油站。 第二行有 k+1 个整数,表示第 k 个加油站与第k-1 个加油站之间的距离。 第 0 个加油站表示出发地,汽车已加满油。 第 k+1 个...

    汽车加油问题 对于给定的n和k个加油站位置,编程计算最少加油次数。

    每组测试数据输入的第一行有2 个正整数n和k,表示汽车加满油后可行驶n公里,且旅途中有k个加油站。接下来的1 行中,有k+1 个整数,表示第k个加油站与第k-1 个加油站之间的距离。第0 个加油站表示出发地,汽车已加满...

    贪心算法解汽车加油问题实验报告

    一辆汽车加满油后可行驶n千米。旅途中有若干个加油站。若要使沿途加油次数最少,设计一个有效算法,指出应在哪些加油站停靠。

    汽车加油问题+算法设计

    问题描述:一辆汽车加满油后可行驶 n 公里, 旅途中有若干个加油站。 请指出应在哪些加油站停靠加油使得沿途加油次数最少。本题对于给定的正整数 n 和 k 个加油站位置, 请计算最少加油次数。

    汽车加油问题 java

    算法设计与分析 汽车加油问题 java int n,k; int count=0;//加油次数 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入汽车加满油后可行驶路程:"); ...

    汽车加油问题 贪心算法实现 源代码 算法设计与分析实验

    汽车加油问题 一辆汽车加满油后,可行使n千米。旅途中有若干个加油站。若要使沿途加油次数最少,设计一个有效算法,对于给定的n和k个加油站位置,指出应在哪些加油站停靠加油才能使加油次数最少。 实验提示: 把两...

Global site tag (gtag.js) - Google Analytics